2015-05-13 33 views
3
<UserControl x:Class="MyApp.PrinterSelection" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      xmlns:Printing="clr-namespace:System.Drawing.Printing;assembly=System.Drawing" 
      xmlns:local="clr-namespace:MyApp" 
      mc:Ignorable="d" 
      d:DesignHeight="300" d:DesignWidth="300"> 

<Grid> 

     <ListBox x:Name="displayInstalledPrinterListView" HorizontalAlignment="Left" Height="311" Margin="10,0,0,0" VerticalAlignment="Top" Width="499" ItemsSource="{x:Static Printing:PrinterSettings.InstalledPrinters}" SelectionChanged="displayInstalledPrinterListView_SelectionChanged" AlternationCount="2" FontSize="16"/> 
    </Grid> 

如何指定ListBox中的哪台打印机是使用XAML的默认打印机。如果用XAML无法做到这一点,那么最好的方法是什么?XAML显示哪个已安装的打印机是默认的

我知道我可以通过程序检查每台打印机来查看IsDefaultPrinter是否为true。不过,我想知道这是否可以用XAML(只)

+0

点击此处查看此链接 - > http://stackoverflow.com/questions/86138/whats-the-best-way-to-get-the-default-printer-in-net那里有很好的信息 – waltmagic

+0

is there一种使用XAML的IsDefaultPrinte方法? “使用XAML” –

+1

“编程项目中仍然存在C#权利?亚历山大的答案应该适用于任何情况。在你的C#代码中应用Alexander的答案,你会发现成功。 – waltmagic

回答

1

这并不完全清楚,我什么专门您有麻烦,也不希望如何打印机名称的视觉显示改变来完成。所以,这里是一个显示所有已安装的打印机,与当前的默认打印机的名称以及相应的仅XAML的实现的通用例如:

<Window x:Class="TestSO30225596DefaultPrinter.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:Printing="clr-namespace:System.Printing;assembly=System.Printing" 
     Title="MainWindow" Height="350" Width="525"> 
    <Window.Resources> 
    <Printing:LocalPrintServer x:Key="localPrintServer1"/> 
    <ObjectDataProvider x:Key="printerCollection" 
         ObjectInstance="{StaticResource localPrintServer1}" 
         MethodName="GetPrintQueues"> 
     <ObjectDataProvider.MethodParameters> 
     <x:ArrayExtension Type="{x:Type Printing:EnumeratedPrintQueueTypes}"> 
      <Printing:EnumeratedPrintQueueTypes>Local</Printing:EnumeratedPrintQueueTypes> 
      <Printing:EnumeratedPrintQueueTypes>Connections</Printing:EnumeratedPrintQueueTypes> 
     </x:ArrayExtension> 
     </ObjectDataProvider.MethodParameters> 
    </ObjectDataProvider> 
    </Window.Resources> 
    <Grid> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="*"/> 
     <RowDefinition Height="Auto"/> 
    </Grid.RowDefinitions> 
    <ListBox x:Name="displayInstalledPrinterListView" 
      HorizontalAlignment="Left" VerticalAlignment="Top" 
      Height="311" Width="499" Margin="10,0,0,0" 
      ItemsSource="{Binding Source={StaticResource printerCollection}}" 
      AlternationCount="2" FontSize="16"> 
     <ListBox.ItemTemplate> 
     <DataTemplate> 
      <StackPanel Orientation="Horizontal"> 
      <TextBlock Text="{Binding Name}"/> 
      </StackPanel> 
     </DataTemplate> 
     </ListBox.ItemTemplate> 
    </ListBox> 
    <StackPanel Orientation="Horizontal" Grid.Row="1"> 
     <TextBlock Text="Default Printer: "/> 
     <TextBlock Text="{Binding Source={StaticResource localPrintServer1}, Path=DefaultPrintQueue.Name}"/> 
    </StackPanel> 
    </Grid> 
</Window> 

请注意,您将需要添加一个参考WPF兼容的System.Printing.dll组件。以上技术上符合您的广泛规格,即它确实指示(通过ListBox下方显示的文本)哪个打印机是默认打印机。

我相信,鉴于上述示例,您可以根据您的特定需求对其进行修改,方法是使用DefaultPrintQueue.Name属性值与每台打印机的实际名称进行比较,然后根据该值显示您认为最合适的指示。

1

您可以使用下面的代码:

XAML:

<Window x:Class="WpfApplication1.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:local="clr-namespace:WpfApplication1" 
     Title="MainWindow" Height="350" Width="525"> 
    <Grid> 
     <ComboBox HorizontalAlignment="Center" VerticalAlignment="Center" ItemsSource="{Binding Printers}"> 
      <ComboBox.ItemTemplate> 
       <DataTemplate DataType="{x:Type local:PrinterWrapper}"> 
        <Grid> 
         <Grid.ColumnDefinitions> 
          <ColumnDefinition Width="Auto"/> 
          <ColumnDefinition Width="*"/> 
         </Grid.ColumnDefinitions> 
         <TextBlock Text="Default - " x:Name="default" Visibility="Collapsed"/> 
         <TextBlock Text="{Binding PrinterName}" Grid.Column="1" /> 
        </Grid> 
        <DataTemplate.Triggers> 
         <DataTrigger Binding="{Binding IsDefaultPrinter}" Value="True"> 
          <Setter TargetName="default" Property="Visibility" Value="Visible"/> 
         </DataTrigger> 
        </DataTemplate.Triggers> 
       </DataTemplate> 
      </ComboBox.ItemTemplate> 
     </ComboBox> 
    </Grid> 
</Window> 

代码背后:

using System; 
using System.Collections.Generic; 
using System.Collections.ObjectModel; 
using System.Linq; 
using System.Printing; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Data; 
using System.Windows.Documents; 
using System.Windows.Input; 
using System.Windows.Media; 
using System.Windows.Media.Imaging; 
using System.Windows.Navigation; 
using System.Windows.Shapes; 

namespace WpfApplication1 
{ 
    /// <summary> 
    /// Interaction logic for MainWindow.xaml 
    /// </summary> 
    public partial class MainWindow : Window 
    { 
     public MainWindow() 
     { 
      InitializeComponent(); 
      this.DataContext = new ViewModel(); 
     } 
    } 

    public class ViewModel 
    { 
     public ObservableCollection<PrinterWrapper> Printers { get; set; } 

     public ViewModel() 
     { 
      this.Printers = new ObservableCollection<PrinterWrapper>(); 

      LocalPrintServer server = new LocalPrintServer(); 
      var printQueues = server.GetPrintQueues(new EnumeratedPrintQueueTypes[] { EnumeratedPrintQueueTypes.Local, EnumeratedPrintQueueTypes.Connections }); 
      foreach (var printQueue in printQueues) 
      { 
       var printerWrapper = new PrinterWrapper(); 
       printerWrapper.PrinterName = printQueue.Name; 
       printerWrapper.IsDefaultPrinter = (printQueue.Name == server.DefaultPrintQueue.Name); 

       this.Printers.Add(printerWrapper); 
      } 
      server.Dispose(); // Depends on you :-) 
     } 
    } 
    public class PrinterWrapper 
    { 
     public string PrinterName { get; set; } 
     public bool IsDefaultPrinter { get; set; } 
    } 
} 

注:PrinterWrapper类,你可以用它来容纳更多的打印相关的属性并在ViewModel你可以写你的prin婷的逻辑。而不是在默认打印机名称之前显示默认文本,您可以使用一些图像或其他一些花哨的东西。

相关问题