Time of Update: 2018-12-07
第一種方法就是通過XamlWriter和XamlReader,這個理解起來很容易,因為它們在XAML中都可以定義。代碼:static T DeepCopy<T>(T textElement) where T : TextElement{ var stream = new System.IO.MemoryStream(); System.Windows.Markup.XamlWriter.Save(textElement, stream); stream.Seek(0
Time of Update: 2018-12-07
如果在FlowDocument中加入Canvas:<FlowDocumentScrollViewer> <FlowDocument> <BlockUIContainer> <Border BorderBrush="Navy" BorderThickness="1"> <Canvas> <Button
Time of Update: 2018-12-07
WPF中的TileBrush是DrawingBrush,ImageBrush和VisualBrush的基類。定義著這三種Brush的公用特性。本文以ImageBrush做樣本,其他類型讀者可以舉一反三。 TileBrush的Stretch屬性預設是Stretch,因此預設TileBrush的內容會展開到全部可用空間內:<ImageBrush
Time of Update: 2018-12-07
感謝WPF的強大封裝,這一切竟然3段代碼就完成了。比如我們常見到的那個兔子揉臉的GIF: 程式運行結果: 代碼則是使用BitmapDecoder類型,針對GIF動畫,則需要初始化它的子類GifBitmapDecoder。而BitmapDecoder得Frames屬性則包含一系列的BitmapFrame。這個類型是BitmapDecoder(和BitmapEncoder)中用到的映像幀,繼承自BitmapSource,因此本質上也是一種位元影像類型。 XAML:<ListBox Name="
Time of Update: 2018-12-07
是因為ContentPresenter.ContentSource比Content屬性加一個TemplateBinding看起來更方便?不僅僅是這些,實際上如果用ContentSource的話,Content相關的屬性比如ContentStringFormat,ContentTemplate和ContentTemplateSelector都會被自動化佈建,而如果用Content加TemplateBinding,你必須手動將上述屬性綁定到ContentPresenter上。 比如使用Content
Time of Update: 2018-12-07
曾經寫過一篇文章:WPF:實現一個很簡單的設計器(移動和縮放控制項),講了使用WPF中的Adorner來修飾Canvas中的元素從而使它們可以被移動或者縮放。今天講通過原始事件的方法來使Canvas中的元素可以被移動。 首先就是定義一個Canvas,然後定義Canvas中的控制項。接著使用MouseMove,MouseDown,MouseUp這三個Bubble類型的路由事件。我們將會在之後填充這三個事件。 XAML定義:<Canvas Name="canvas"
Time of Update: 2018-12-07
許多WPF控制項範本定義沒有考慮到成員為null(預設值)的情況,比如下面定義的HeaderedContentControl的控制項範本:<ControlTemplate TargetType="HeaderedContentControl"> <DockPanel> <Border DockPanel.Dock="Top" BorderBrush="Red" BorderThickness="2"
Time of Update: 2018-12-07
程式效果: WPF 3D中的TranslateTransform3D應該是所有3D變換中最簡單的變換,使用起來非常簡單,先定義好3D對象,接著在適當的位置加入變換就可以了。 當然WPF 3D中變換(Transform3D類型)可以應用在如下屬性中:照相機:Camera類型3D模型定義:Model3D類型容納3D模型的Visual3D:ModelVisual3D類型 對於2D的TranslateTransform,只有兩個屬性X和Y。3D的TranslateTransform則對應OffsetX,
Time of Update: 2018-12-07
Eazfuscator.NET對特性的處理有好有壞,好的方面如果類型被標記了可序列化(Serializable特性),Eazfuscator.NET自動不會修改類型名稱的,因為序列化和還原序列化過程需要驗證對象的類型資訊。不好的一個方面則是在屬性上標記的特性會消失。 如下我們定義一個特性,然後應用在類,屬性,欄位和方法上:class MyAttr : Attribute { } [MyAttr]class b{ [MyAttr] public int aaa; [MyAttr]
Time of Update: 2018-12-07
當From為null時:自動讀取相依性屬性的當前值(Current Value)。當To為null時:自動讀取相依性屬性的基值(Base Value)。 關於相依性屬性的基值和當前值簡單的說優先順序是:當前值 > 動畫設定值 > 基值。更多資訊可以參考另一篇文章:WPF相依性屬性的當前值(Current Value),基值(Base Value)和本地值(Local Value) 做一個小實驗:一個按鈕,原始寬度是100。然後執行兩個動畫,第一個動畫設定To為200。From沒設定(
Time of Update: 2018-12-07
這兩個方法可以在自訂控制項中建立內建WPF命令,比如WPF中TextBox內建複製,剪下,粘貼命令。其中RegisterClassInputBinding將一個命令和輸入筆勢(Input
Time of Update: 2018-12-07
可以漸層顯示,隱藏或刪除一個自訂裝飾器元素,目標可以是任何UIElement。示範:比如介面上的TextBox: 點擊顯示後,漸層出現自訂裝飾器的內容: 點擊不顯示,裝飾器內容會漸層消失。刪除功能也一樣,只不過刪除後內容不可以再次顯示,因為裝飾器已經在裝飾層被刪除了。 原理很簡單,可能唯一需要注意的是動畫的添加,可以參考這篇文章: WPF:在裝飾器(Adorner)中加入動畫 V2更新(2012-01-28):增加對進入和移除時間的分別控制。修正狀態變化。 下載:V2原始碼下載
Time of Update: 2018-12-07
WPF中的TabControl也是繼承與ItemsControl,因此也同ListBox一樣支援清單控制項的資料繫結。比如最簡單的直接設定TabControl的ItemsSource屬性。tabControl.ItemsSource = Enumerable.Range(1, 10); 結果是TabControl中每一個TabItem的Header和Content都是一樣的: 如果要單獨設定TabItem的Header屬性的資料範本,則需要設定TabControl的ItemTemplate屬性:
Time of Update: 2018-12-07
在.NET 4.0之前,定義資料繫結的驗證錯誤模板只能通過Validation.ErrorTemplate附加屬性。模板的具體定義也很不舒服,大體上是定義一個沒有TargetType的ControlTemplate,然後在模板中加入AdornedElementPlaceholder。由於模板是在裝飾器層中顯示,所以對控制項布局的設定局限性很大。 在.NET 4.0後有了可視狀態(Visual State)前來支援,這個概念早在Silverlight
Time of Update: 2018-12-07
注意:文章將使用Microsoft XPS Document Writer虛擬印表機列印XPS文檔,該印表機在Windows
Time of Update: 2018-12-07
目錄0:DataGridColumn類型的繼承樹 1:設定DataGridBoundColumn 2:設定DataGridComboBoxColumn 3:設定DataGridTemplateColumn 返回目錄
Time of Update: 2018-12-07
路由事件的RoutedEventArgs有一個Handled屬性,當接收方將Handled屬性設定為True時,該事件則被標記為已處理,事件來源將不再發送事件。事實上,事件依然被發送,因為WPF中的很多核心組件都依靠路由事件在Visual
Time of Update: 2018-12-07
為什麼需要顯示列印對話方塊,因為我們不知道使用者要用哪個印表機和具體的列印選項,如果我們知道的話,那麼就不需要顯示這個對話方塊。WPF中PrintDialog(在System.Windows.Controls命名空間內)儲存使用者選擇的屬性是PrintQueue和PrintTicket屬性,分別代表使用者選擇的印表機和列印選項。 注意:下面代碼需要引用:System.Printing.dll並且在代碼上加入命名空間:using
Time of Update: 2018-12-07
來跟隨我,細數一下WPF
Time of Update: 2018-12-07
微軟Office 2010的介面使用了漸層的Aero表單效果,如: 那麼怎樣在WPF中做類似的表單呢?看我的答案: 注意:下面文章的內容會使用到Windows Vista(和之後的Windows系統)特有的API,讀者需要下載:Windows API Code Pack for Microsoft .NET Framework方可運行或者編譯相應的程式。 首先需要引用Windows API Code