WPF(MVVM) 热键快捷键设置

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/baidu_38131614/article/details/77878768

我感觉我离MVVM越走越远。。。。有点不是MVVM了

主窗口Ctrl+Q关闭程序  T工具窗口

<Window.Resources>
        <!-- 退出系统热键-->
        <RoutedUICommand x:Key="CloseCommand" Text="Button Click"/>
        <!-- 工具箱热键-->
        <RoutedUICommand x:Key="ToolBarCommand" Text="Button Click"/>
    </Window.Resources>
    <Window.InputBindings>
        <KeyBinding Gesture="Ctrl+Q"  Command="{StaticResource  CloseCommand}"/>
        <KeyBinding Key="T"   Command="{StaticResource ToolBarCommand}"/>
    </Window.InputBindings>
    <Window.CommandBindings>
        <CommandBinding Command="{StaticResource  CloseCommand}"
                        CanExecute="CommandBinding_CanExecute1"
                        Executed="CommandBinding_Executed1"/>
        <CommandBinding Command="{StaticResource ToolBarCommand}"
                        CanExecute="CommandBinding_CanExecute2"
                        Executed="CommandBinding_Executed2"/>
    </Window.CommandBindings>
,cs中
/// <summary>
        /// Ctrl+Q 退出热键绑定
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void CommandBinding_CanExecute1(object sender, CanExecuteRoutedEventArgs e)
        {
            e.CanExecute = true;
        }

        private void CommandBinding_Executed1(object sender, ExecutedRoutedEventArgs e)
        {
            this.Close();
        }

        /// <summary>
        /// "T"工具箱热键  
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void CommandBinding_CanExecute2(object sender, CanExecuteRoutedEventArgs e)
        {
            e.CanExecute = true;
        }
        private void CommandBinding_Executed2(object sender, ExecutedRoutedEventArgs e)
        {          
            if (mainpageviewmodel == null)
            {
                MessageBox.Show("出错!!!");
            }
            else
            {
                mainpageviewmodel.ToolBarExecute(this);
            }
        }

唯一与MVVM有关的是 ,在这里有点击打开链接

 mainpageviewmodel.ToolBarExecute(this)
展开阅读全文

WPF MVVM 清除绑定

07-01

WPF板块:rnrn老哥们 ,我遇到一个情况,就是当界面里一个图片绑定了BitmapImage 属性源的情况下,无法释放内存。是一个大项目中的一个问题,我整理了一下,下面用一个简单的示例演示:rnrn界面绑定了一个图片:rn[code=html]rnrn rn rn rnrn[/code]rnrn这个图片绑定的属性源:rn[code=csharp]rn private BitmapImage imageSource1;rnrn public BitmapImage ImageSource1rn rn getrn rn return imageSource1;rn rn setrn rn imageSource1 = value;rn if (null != PropertyChanged)rn rn PropertyChanged.Invoke(this, new PropertyChangedEventArgs("ImageSource1"));rn rn rn rn[/code]rnrn为了演示内存没被释放 ,用一个在MainWindow上的按钮来弹出上面的Window1界面:rn[code=html]rnrn rn rn rnrn[/code]rnrn[code=csharp]rn private void button_Click(object sender, RoutedEventArgs e)rn rnrn BitmapImage imageSource1 = new BitmapImage();rn imageSource1.BeginInit();rn imageSource1.CacheOption = BitmapCacheOption.OnLoad;rn imageSource1.StreamSource = new MemoryStream(File.ReadAllBytes("TestImage.png"));rn imageSource1.EndInit();rnrn Window1 w1 = new Window1();rn w1.ImageSource1 = imageSource1;rn w1.ShowDialog();rnrn //BindingOperations.ClearBinding(w1.image, System.Windows.Controls.Image.SourceProperty);rnrn rn[/code]rnrn在没关闭Window1界面的时候,内存里是有 Window1 这个实例的:rn[img=https://img-bbs.csdn.net/upload/201807/01/1530418552_514357.png][/img]rnrn当我关闭Window1界面的时候,内存里是还是有 Window1 这个实例的,显然Window1 没被释放掉:rn[img=https://img-bbs.csdn.net/upload/201807/01/1530418730_110676.png][/img]rnrn找了很久,发现原来是图片一直占用着绑定资源,直到我手动加上最后一句:rnrn[code=csharp]rn private void button_Click(object sender, RoutedEventArgs e)rn rnrn BitmapImage imageSource1 = new BitmapImage();rn imageSource1.BeginInit();rn imageSource1.CacheOption = BitmapCacheOption.OnLoad;rn imageSource1.StreamSource = new MemoryStream(File.ReadAllBytes("TestImage.png"));rn imageSource1.EndInit();rnrn Window1 w1 = new Window1();rn w1.ImageSource1 = imageSource1;rn w1.ShowDialog();rnrn BindingOperations.ClearBinding(w1.image, System.Windows.Controls.Image.SourceProperty);rnrn rn[/code]rnrn内存就被释放掉了:rnrn但是用这句就不能释放,存留疑问:rn[code=csharp]rnBindingOperations.ClearAllBindings(w1);rn[/code]rnrn有人说换图片数据源,不要这么赋值,我也试过了,从一个文件直接绑定图片,是可以释放掉的,但是项目里是从硬件里copy过来byte[]转换成的图片, 上面的只是我为了演示,暂时从图片文件里获取。rnrn最后,我就是想知道有没有其它方法能够释放掉上面的图片绑定,我不想给界面控件赋上一个x:Name="xxx" ,然后再用下面的方式去解绑BindingOperations.ClearBinding([color=#FF0000]w1.xxx[/color], System.Windows.Controls.Image.SourceProperty)rnrn显然不符MVVM的风格,ViewModel里还有各种页面控件,看起来就很乱,有没有其它能从属性源头解绑的方式?或者其它更好的解绑做法?rnrn谢谢 老哥们了~ 论坛

没有更多推荐了,返回首页