wpf記錄

WPF開發問題點與解決方法記錄
1. WPF DataGrid 右鍵聚焦當前行問題。


原因分析:左鍵聚焦,右鍵調取菜單,因爲菜單分爲行菜單與整張表格菜單,導致右鍵常常無法準確聚焦某一行。
方法:添加LoadingRow事件,在加載行時爲每行添加右鍵事件,該事件的實現內容時Focus().
//頁面後臺文件中添加
private void dg_LoadingRow(object sender, DataGridRowEventArgs e)
        {
            e.Row.MouseRightButtonDown += (s, a) =>
            {
                a.Handled = true;
                (sender as DataGrid).SelectedIndex = (s as DataGridRow).GetIndex();
                (s as DataGridRow).Focus();
            };
        }
//前段頁面添加事件
<DataGrid
            ...
LoadingRow="dataGridMotionList_LoadingRow">

2. While循環一直調用,導致cpu佔用過高。


原因分析:無論是UI線程還是臨時子線程,在執行耗時代碼時,若沒有請求CPU分配時間片,Cpu會將全部或者大部分的資源都耗在該線程中直到線程退出。
方法:在耗時線程中添加Thread.Sleep(1); 便能將Cpu使用率降到10%以下
while(true){
Thread.Sleep(1);//通知cpu分配時間片
//你的代碼
}
3.彈出窗口執行Close()時關閉不乾淨,二次Show的時候報異常:無法再次顯示未關閉的對話框。


分析原因:調用this.close() 不能完整得關閉窗口,因爲窗口已經註冊過,需要進系統窗口將其刪除,或殺死該APP進程(Application.Current.Shutdown();)。
方法:將窗體不用的時候隱藏起來,一般彈出框只是顯示功能並不太佔資源。
/// <summary>
        /// 重寫OnClosing事件 解決窗口關閉不能再開的bug。
        /// </summary>
        /// <param name="e"></param>
        protected override void OnClosing(System.ComponentModel.CancelEventArgs e)
        {
            this.Hide();
//窗體內容清空
        }
6.自定義命令綁定
WPF提供很多窗體所需的命令,只需要做簡單綁定就能使用,比如:
<Window.CommandBindings>
<CommandBinding Command="ApplicationCommands.Open" Executed="OpenCommand_Executed"/>
</Window.CommandBindings>
........
<MenuItem Header="載入(用例或配置)" Command="Open">
而有些特殊按鈕希望通過命令觸發而不是Click事件的則需要自定義命令並綁定。
自定義命令要求所有定義以及事件處理調用都爲靜態,所以如果實在窗體類中定義命令時,需要再創建靜態構造方法來定義 如:
private static  RoutedUICommand autoMove;
static MainWindow()
{
InputGestureCollection inputs = new InputGestureCollection();
inputs.Add(new KeyGesture(Key.A, ModifierKeys.Control, "A"));
autoMove = new RoutedUICommand("aa", "ff", typeof(MainWindow), inputs);
CommandManager.RegisterClassCommandBinding(typeof(MainWindow), new CommandBinding(autoMove, CommandBinding_Executed));
}
定義內容裏前兩句是爲該命令創建快捷鍵輸入觸發,如不需要可忽略。第三句是命令定義實體,此次定義的是RoutedUICommand,它是RoutedCommand的一個分支,參數按需傳遞。注意new的時候前兩個字符串爲空會報異常。第三個參數的Type表示命令作用畫面的類型。 最後一句就是綁定了,首先說明該綁定的作用類,然後創建綁定,將命令與執行方法綁在一起,該執行方法即命令觸發事件。
使用時需指明路徑:
xmlns:local="clr-namespace:XXXXXX" 
Command="local:MainWindow.AutoMove" //這是所有涉及的方法與屬性必須靜態的原因。

有時爲了統一,也可以將綁定語句寫在Xaml裏如
<Window.CommandBindings>
<CommandBinding Command="local:MainWindow.AutoMove" Executed="CommandBinding_Executed"/>
</Window.CommandBindings>
使用方法同上。


WPF界面優化記錄
1.將子窗體顯示在父窗體任意位置。
方法:
WindowStartupLocation="Manual" 表示位置可變
在show之前設置
_Instance.Owner = owner as System.Windows.Window;
            _Instance.Top = _Instance.Owner.Top + _Instance.Owner.Height/1.1;
            _Instance.Left = _Instance.Owner.Left + _Instance.Owner.Width/2;
其中,可重寫Show代碼或者其他方法,將該子窗體的父窗體對象傳進來,然後基於父窗體設置該窗體的相對位置。
2.自定義窗體拖動欄(實現與Windows下相似的功能)
分析原因:win7自帶的窗體邊框樣式單一不方便修改重寫,所以並將其棄用,自建邊框,但原本該有的關閉 放大 縮小 拖動等功能是必要的。
方法:
[1]刪除原有的邊框  
WindowStyle="None"   //必要
        AllowsTransparency="True" //必要
        Background="Transparent"
[2]將窗體分成上下兩個Row,在Row0的地方建一個佈局,當做窗體的拖動欄。在其上添加右鍵按下事件MouseLeftButtonDown,事件內容爲this.DragMove();
[3]在Row0的佈局裏添加標題、菜單、和按鈕,實現放大隱藏和關閉功能,分別是
放大: this.Height = SystemParameters.WorkArea.Height;
                this.Width = SystemParameters.WorkArea.Width;
                this.Top = 0;
                this.Left = 0;
隱藏:this.WindowState = WindowState.Minimized;
關閉:如果是主窗體,Application.Current.Shutdown();  否則調用this.Close().





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章