Time of Update: 2018-12-07
這屬於老話題了,這篇文章就算做一個小匯總吧。 例子就比如要修改表單的Title屬性,單線程的話,直接寫代碼就可以了,比如在Window的Loaded事件中修改Title:private void Window_Loaded_1(object sender, RoutedEventArgs e){ Title = "Mgen";} 直接用多線程修改的話:System.Threading.ThreadPool.QueueUserWorkItem(_ => Title = "Mgen");
Time of Update: 2018-12-07
這篇文章是其他文章的續寫,參考上文:WPF:更好得理解對話方塊和ShowDialog方法.NET(C#) 平台叫用:不依賴平台的GetWindowLongPtr和SetWindowLongPtr API 更新:感謝網友Engineer的評論,這一切可以在WPF中實現:ResizeMode=NoResize將不會顯示最大化最小化,只有關閉按鈕
Time of Update: 2018-12-07
RenderTargetBitmap繼承自BitmapSource類型,並且定義有Clear和Render兩個重要方法,一個將圖片全部設定成黑色透明,另一個將WPF中的Visual對象輸出到映像中。 RenderTargetBitmap的建構函式參數都是構建位元影像映像的常用屬性:像素大小、DpiX、DpiY和像素儲存格式。對於普通圖片儲存,使用預設值就可以了。Dpi相關的參數用0(0代表使用預設值,而最終圖片的Dpi是不可能為0的,通常預設的是96),像素儲存格式用PixelFormats.D
Time of Update: 2018-12-07
Control(包括ContentControl),ContentPresenter MeasureOverride:用可用空間測量第一個Visual Tree子節點(調用Measure(availableSize參數)),並返回成員的期待大小(UIElement的DesiredSize)。ArrangeOverride:把第一個Visual Tree子節點視圖放在當前最終大小的(0,0)座標上(調用Arrange,用(0,0,finalSize)作參數)。 TextBlock
Time of Update: 2018-12-07
測試如下事件和方法:UIElement:OnRender方法。LayoutUpdated事件。 FrameworkElement:OnMeasureOverride方法。OnArrangeOverride方法。Loaded事件。Initialized事件。 以及自訂控制項中的相依性屬性設定。 代碼:class TestControl: Control{ public TestControl() { Loaded += new
Time of Update: 2018-12-07
對於WPF導航來說,最大的瓶頸在於當前Page類型並沒有提供直接的針對Page自己資料傳遞的屬性或者方法,也就是說每一個Page從導航至顯示的整個過程Page本身是無從得知的。於是只能通過Frame類型的相關事件。當然本質上都是依靠被一個專門負責導航的類型:NavigationService類型。而NavigationService類型的事件都是針對整個導航的全域狀態的,Page類型是無法直接得到這些資料的。(注意Page類型也有NavigationService屬性)。 而Silverligh
Time of Update: 2018-12-07
標題就是事實,Control類型中影響顯示的相依性屬性在註冊的時候都沒有設定FrameworkPropertyMetadataOptions.AffectsRender屬性,而是FrameworkPropertyMetadataOptions.None,比如Foreground,Background,BorderThickness……。另一些文字相關的屬性則是FrameworkPropertyMetadataOptions.Inherits,同樣沒有AffectsRender枚舉值。這些可以在R
Time of Update: 2018-12-07
目錄1. 關於標準對話方塊2. 關於ShowDialog方法3. 示範工程下載 返回目錄1. 關於標準對話方塊首先,一個標準的對話方塊應該嚴格具備至少如下特點:只要背後父表單顯示,它一定會顯示,並且覆蓋在父表單之上。 對話方塊的視窗標題不會顯示在工作列中的,工作列僅會顯示主表單的名稱。 對於強制回應對話方塊(Model Dialog),只有對話方塊關閉後,背後父表單才會獲得焦點。無強制回應對話方塊(Modeless Dialog)沒有這樣的限制。
Time of Update: 2018-12-07
理解Frame在導航中Source、CurrentSource和Content屬性,以及導航事件中NavigationEventArgs類型的Uri和Content屬性。 在Frame的Navigating和Navigated事件中,插入如下調試代碼:Debug.WriteLine("NavigationEventArgs.Uri: " + e.Uri);Debug.WriteLine("NavigationEventArgs.Content: " +
Time of Update: 2018-12-07
FrameworkPropertyMetadataOptions.Inherits這個Inherit做得非常徹底,他會把所有Visual Tree中的節點都會遍曆一個遍,順序是先是父節點,然後子節點。 比如定義一個附加屬性:Mgen.AttachedDp:public static readonly DependencyProperty AttachedDpProperty = DependencyProperty.RegisterAttached("AttachedDp",
Time of Update: 2018-12-07
在XAML中使用Label.Target,我們通常需要一個資料繫結來設定一個已命名的對象。這樣不僅需要給對應控制項加入名稱,同時還得用資料繫結來把Target屬性和對應控制項聯絡起來,比如這樣:<Label Target="{Binding ElementName=tbx}">姓名(_N)</Label><TextBox
Time of Update: 2018-12-07
目錄WPF中KeepAlive和FrameworkPropertyMetadataOptions.JournalSilverlight中NavigationCacheMode和CacheSize 返回目錄WPF中KeepAlive和FrameworkPropertyMetadataOptions.Journal在WPF中,Page預設是不緩衝的。每次導航返回至Page,Page都要被重新構建。 為了方便做測試,我們這樣定義Page,首先在Page中註冊一個普通的相依性屬性,預設值是“預設”。
Time of Update: 2018-12-07
左鍵畫筆,右鍵橡皮,就可以繪畫了。 網格個數,顏色和網格邊框都是可以設定的: 本來是作為可惡的課程作業,現在又把它好好改了改發上來。 程式和原始碼下載 注意:此為微軟SkyDrive存檔,請用瀏覽器直接下載,用某些下載工具可能無法下載 樣本程式運行環境:.NET Framework 4.0 Client Profile 原始碼環境:Microsoft Visual C# 2010 Express
Time of Update: 2018-12-07
整個MVVM
Time of Update: 2018-12-07
嚴格上講,Visual Tree和Logical Tree是WPF的概念,不過既然都有XAML,那麼它們在WinRT中也是存在的。 首先WinRT中沒有WPF中的Visual,UIElement是直接繼承自DependencyObject的,然後下面是FrameworkElement。 接下來就是使用Windows.Ui.Xaml命名空間下的VisualTreeHelper類型,使用起來和WPF類似,比如根據當前元素尋找上面的Visual
Time of Update: 2018-12-07
WinRT的導航變化很大,當然從WPF,到Silverlight到現在的WinRT,XAML中的導航一直在變!(可以參考之前的一篇文章:從WPF到Silverlight到WinRT:導航的變化)。WinRT使用了一種特有的導航方式,以Type為標識的導航!微軟彷彿在強制命令我們寫入UI上資料的讀取和儲存邏輯。為什麼這樣說?因為在WinRT中,即便是你使用NavigationCacheMode.Enabled或者NavigationCacheMode.Required,頁面也確實被緩衝了,但是問題
Time of Update: 2018-12-07
做項目中橫向顯示一堆控制項,然後當整體空間變小後,需要先將StackPanel中的一個控制項縮小。效果如:當表單縮小後,中間紅色的TextBlock被縮小,當然如果TextBlock的Width已經成0後,整體控制項變不回縮小(此時裁剪髮生)。當然注意當空間足夠大時,紅色TextBlock依然和後面Button緊貼著不會變大,這也是為什麼Grid無法解決這個問題。 寫了個小控制項:MyPanel,邏輯上等於一個橫向的StackPanel。不過通過MyPanel的IsCut附加屬性可以設定需要縮
Time of Update: 2018-12-07
一年前寫過一篇文章:WPF:為ListBox添加和刪除資料加動畫效果,現在想到了一種更好的方法為ListBox資料的添加和刪除做動畫,訣竅就是做一個支援動畫的StackPanel。看了一篇非常好的文章:http://www.switchonthecode.com/tutorials/wpf-tutorial-creating-a-custom-panel-control,瞬間有了靈感。 這個StackPanel在Arrange的時候,首先設定子控制項的RenderTransform為Transl
Time of Update: 2018-12-07
在WinRT XAML Toolkit中發現另一個CodePlex中的架構AsyncUI。感覺很有意思,使用它可以用C# 5.0的async/await特性來等待介面上的事件。 比如這樣,介面上有一個Button的Name是btn,然後在Page的Loaded事件中可以這樣寫。//+ using WinRTXamlToolkit.AsyncUI;//Main_Loaded_1為Page的Loaded事件//主介面上有一個Name為btn的Buttonprivate async void
Time of Update: 2018-12-07
WPF中的Windows的ShowDialog方法並沒有提供設定Owner的參數,開發人員需要在ShowDialog前設定好Window的Owner屬性,正因為如此,許多時候你可能就忘了設定Owner,直接把對話方塊顯示出去了。這樣顯示的對話方塊看似沒有問題,但是當使用者在工作列切換表單或者切換至程式時,對話方塊會顯示在主表單後面,而此時主表單是不可點的!如果主表單可以覆蓋整個對話方塊(通常是這樣的),那麼此時使用者將會無法操作整個程式,這個問題在另一篇文章裡仔細討論過(WPF:更好得理解對話方