在許多應用程序中,GridControl都包含被綁定到特定類型(例如Boolean或Image)字段的列。為了顯示和編輯這些列,需要進行一些特殊的編輯設置(以便提供最好的數據維護方法):對 Boolean 列設置復選框(CheckBox)和對Image 列設置PopupImageEdit。此外,就GridControl導出和打印而言,通常會提出以下問題:
-
當打印網格時,我應該怎樣讓圖像顯示在PopupImageEdit列中呢?
-
如何將文本值(而非復選框)顯示在打印網格中?
-
在打印時,有什么方法可以顯示所有的MemoEdit文本?
所有這些問題都可以通過一個共同的解決方案得以解決,本文將對這一解決方案進行說明。
在打印某個單元格時,其外觀由單元格打印樣式中定義的DisplayTemplate進行定義。因此,如果有必要更改單元格的打印外觀,您需要為該單元格創建一個新的控件模板,并在自定義打印單元格樣式中將其設置為DisplayTemplate。不過,如果您想得到完全自定義的數據打印表示,那么歡迎您使用我們的XtraReports產品,可以為您提供強大而靈活的方法創建自定義報表。
例如,如果將PopupImageEdit用作某個列的編輯器,在打印時您可能想要將圖像顯示在該列的單元格中。我們的想法就是將ImageEdit控件放入單元格顯示模板中,并將其源屬性綁定到單元格值上。
[XAML]
<Style x:Key="ImageColumnPrintingStyle" TargetType="{x:Type dxe:PopupImageEdit}" BasedOn="{StaticResource {dxgt:TableViewThemeKey ResourceKey=DefaultPrintCellStyle}}">
<Setter Property="dxp:ExportSettings.TargetType" Value="Panel"/>
<Setter Property="DisplayTemplate">
<Setter.Value>
<ControlTemplate TargetType="dxe:PopupImageEdit">
<dxe:ImageEdit Source="{Binding Path=Value}" IsPrintingMode="True"/>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
該擴展應用標記語言(xaml)包含了一些重要的細節。首先,這種樣式聲明具有TargetType 和BasedOn 屬性說明語言。新的單元格打印樣式必須建立在預定義的DefaultPrintCellStyle 上。TargetType屬性必須設置為列(這種樣式將應用到該列中)中所用編輯器的屬性類型。
第二,該模板中使用的所有控件必須接受打印調整。因此,繼承BaseEdit的任何控件必須將IsPrintingMode屬性設置為真。
其他控件必須接受通過ExportSettings附加屬性執行的打印調整。因此,必須為這些控件提供ExportSettings.TargetType屬性值。xmlns:dxp="http://schemas.devexpress.com/winfx/2008/xaml/printing"命名空間中對該屬性進行了定義,該屬性指定了打印子系統該如何對待這些控件。
例如,如果您想打印TextBlock,有必要將ExportSettings.TargetType指定為Text(文本),然后TextBlock就會被打印出來。如果您想設置某個控件的背景和前景,則需要分別設置ExportSettings.Background和ExportSettings.Foreground。
[XAML]
<TextBlock Text="Textblock text" Margin="10"
Foreground="Red"
dxp:ExportSettings.TargetType="Text"
dxp:ExportSettings.Background="White"
dxp:ExportSettings.Foreground="Red"
/>
形狀和復雜控件可導出為圖像:
[XAML]
<Ellipse Fill="Yellow" Width="15" Height="15"
dxp:ExportSettings.TargetType="Image"
dxp:ExportSettings.Background="Transparent"
/>
如果打印模板中存在面板,則需將它的ExportSettings.TargetType設置到面板(Panel)中,以便讓打印子系統處理子元素。
[XAML]
<StackPanel dxp:ExportSettings.TargetType="Panel">
<TextBlock Text="Property: " Margin="2" dxp:ExportSettings.TargetType="Text"/>
<TextBlock Text="Value" Margin="2" dxp:ExportSettings.TargetType="Text"/>
</StackPanel>
如果控件沒有指定ExportSettings.TargetType的附加屬性,則該控件會被打印子系統忽略,并且不會出現在打印文檔中。這也適用于未設定IsPrintingMode屬性的編輯器。
最后需要注意的是,ImageEdit源屬性被簡單地綁定到單元格值屬性(來自數據上下文)上。因此,您可以很容易地獲取單元格值。
現在,在設置好樣式后,您只需要設置列的PrintCellStyle屬性:
[XAML]
<dxg:GridColumn FieldName="Image" PrintCellStyle="{StaticResource ImageColumnPrintingStyle}">
<dxg:GridColumn.EditSettings>
<dxe:PopupImageEditSettings/>
</dxg:GridColumn.EditSettings>
</dxg:GridColumn>
注:每個PrintCellStyle都會影響特定單元格的外觀。默認情況下,單元格會在默認行模板中排列成一行。如果您想完全改變打印行的外觀,請參閱文章"如何自定義DXGrid打印外觀"。
就復選框(CheckBox)而言,如果您想用有意義的文本表示來取代標準的復選框打印外觀,則可將TextEdit放入單元格的顯示模板內,再通過一個轉換器將其文本屬性綁定到單元格值上(該轉換器會返回適當的文本)。
[XAML]
<local:BoolToTextConverter x:Key="BoolToTextConverter" TrueText="Avaliable" FalseText="NotAvaliable"/>
<Style x:Key="CheckEditColumnPrintingStyle" TargetType="dxe:CheckEdit" BasedOn="{StaticResource {dxgt:TableViewThemeKey ResourceKey=DefaultPrintCellStyle}}">
<Style.Setters>
<Setter Property="dxp:ExportSettings.TargetType" Value="Panel"/>
<Setter Property="DisplayTemplate">
<Setter.Value>
<ControlTemplate TargetType="dxe:CheckEdit">
<dxe:TextEdit Text="{Binding Value, Converter={StaticResource BoolToTextConverter}}"/>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style.Setters>
</Style>
在WPF中完成這項任務的另一種方法就是在顯示模板中定義觸發器,然后將其綁定到編輯器的IsCheked屬性上,再通過觸發器setter處理單元格文本。在這種情況下,無需任何后置代碼。
[XAML]
<ControlTemplate TargetType="dxe:CheckEdit">
<dxe:TextEdit Name="Text"/>
<ControlTemplate.Triggers>
<Trigger Property="IsChecked" Value="True">
<Setter Property="Text" Value="Avaliable" TargetName="Text"/>
</Trigger>
<Trigger Property="IsChecked" Value="False">
<Setter Property="Text" Value="Not avaliable" TargetName="Text"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
注:在Silverlight中沒有觸發器。因此,上述方法只能在WPF應用程序中使用。
如果您在某些單元格中使用了多行編輯器(例如MemoEdit),在打印過程中有必要將文本封裝到編輯器中,對單元格進行渲染。該解決方案與上文所述的方案類似。您可將TextEdit放入單元格的顯示模板中,將其文本屬性綁定到單元格值上,然后將編輯器的TextWrapping屬性設置為渲染(Wrap)。
[XAML]
<Style x:Key="MemoColumnPrintingStyle" TargetType="dxe:MemoEdit" BasedOn="{StaticResource {dxgt:TableViewThemeKey ResourceKey=DefaultPrintCellStyle}}">
<Style.Setters>
<Setter Property="dxp:ExportSettings.TargetType" Value="Panel"/>
<Setter Property="DisplayTemplate">
<Setter.Value>
<ControlTemplate TargetType="dxe:MemoEdit">
<dxe:TextEdit Text="{Binding Value}"
IsPrintingMode="True"
TextWrapping="Wrap"/>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style.Setters>
</Style>
標簽:
本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉載自:慧都控件網