标签: routed-commands

RoutedCommand的类构造函数ownertype参数有什么用?

RoutedCommand的构造函数将"owner type"作为最后一个参数.它的意义是什么?什么时候使用?

MSDN文档完全不知道为什么需要它以及我是否可以为所有命令使用一种类型

从MSDN引用

ownerType
     Type: System.Type The type
     which is registering the command.
Run Code Online (Sandbox Code Playgroud)

还有一件事.从名称数组动态创建新的路由命令时,我应该使用什么类型.它看起来像任何类型的工作,所以我使用UIElement,但如果有一个更适合的类型,我想知道.

wpf routed-commands

9
推荐指数
1
解决办法
1584
查看次数

如何将我的RoutedCommand处理程序从View-codebehind移动到ViewModel?

以下RoutedCommand示例有效.

但是,执行命令的按钮的处理是在视图的代码隐藏中.我理解MVVM的方式应该是在ViewModel中.

但是,当我将方法移动到ViewModel(并将其更改为公共)时,我得到错误" ManagedCustomersView不包含OnSave的定义 ".即使我将RoutedCommand第二个参数更改为typeof(ManageCustomersViewModel),我也会得到相同的错误.

如何将命令处理程序从View-codebehind移动到ViewModel?

ManageCustomersView.xaml:

<UserControl.CommandBindings>
   <CommandBinding Command="local:Commands.SaveCustomer" Executed="OnSave"/>
</UserControl.CommandBindings>
...
<Button Style="{StaticResource formButton}" 
   Content="Save" 
   Command="local:Commands.SaveCustomer"
   CommandParameter="{Binding Id}"/>
Run Code Online (Sandbox Code Playgroud)

ManageCustomersView.xaml.cs:

private void OnSave(object sender
                    , System.Windows.Input.ExecutedRoutedEventArgs e)
{
    int customerId = ((int)e.Parameter);
    MessageBox.Show(String.Format
        ("You clicked the save button for customer with id {0}.", customerId));
}
Run Code Online (Sandbox Code Playgroud)

Commands.cs:

using System.Windows.Input;
using TestDynamicForm123.View;

namespace TestDynamicForm123
{
    public class Commands
    {
        public static RoutedCommand SaveCustomer = 
             new RoutedCommand("SaveCustomer", typeof(ManageCustomersView));
    }
}
Run Code Online (Sandbox Code Playgroud)

wpf routed-commands conceptual mvvm

8
推荐指数
1
解决办法
3690
查看次数

我应该在从程序代码调用Execute之前检查ICommand的CanExecute方法吗?

ICommand在XAML中使用s时,WPF使用该CanExecute方法启用或禁用与该命令关联的控件.但是如果我Execute从程序代码中调用呢?我应该首先检查CanExecute以确保该命令可以执行,还是应该Execute为我处理此检查?

换句话说,我应该这样做:

if (someCommand.CanExecute(parameter, target))
    someCommand.Execute(parameter, target);
Run Code Online (Sandbox Code Playgroud)

或者就是这样:

someCommand.Execute(parameter, target);
Run Code Online (Sandbox Code Playgroud)

.net c# wpf routed-commands icommand

8
推荐指数
2
解决办法
1626
查看次数

如何在视图中拦截RoutedCommand的执行?(WPF/MVVM)

在WPF/MVVM应用程序中,我试图找到一种代码有效的方法,将主视图光标设置Cursors.Wait为任何冗长的操作之前,并在完成后将其恢复为默认光标.

由于使用路由命令调用所有操作,我想找到一种拦截命令执行的方法,理想情况是通过创建包装内置路由命令实例的通用命令类,但我无法想象如何执行这个.

具体来说,该RoutedCommand.Execute方法不是虚拟的,所以我需要另一种机制来拦截它的调用.另外,我不确定泛型命令类的实例如何引用它必须设置游标的视图.

有什么建议吗?

谢谢,

蒂姆

wpf cursor routed-commands mvvm

7
推荐指数
1
解决办法
954
查看次数

分离视图,命令演示(文本,图标)和命令逻辑(执行,CanExecute)

如果TL; DR:见最后一段.

Pure WPF"建议"将表示(控件,文本,图标)放入视图和命令逻辑(Execute,CanExecute方法)到代码隐藏中.除了将逻辑放入视图(CommandBindings)和代码隐藏是一个不受欢迎的练习之外,它对XAML重复没有任何帮助:每次命令都必须复制文本,图标,大图标,提示和许多其他属性用于:主菜单,上下文菜单,工具栏按钮,功能区按钮和其他控件.

看起来像第一个问题(真正分离的观点和逻辑)被解决DelegateCommand,RelayCommand并且接近这样.命令逻辑被移动到ViewModels(或MVVMC中的控制器),代码隐藏是清晰的,没有CommandBindings和其他无意义的视图.

但是,我找不到一个普遍接受的演示文稿重复问题的解决方案.我想分离命令演示(文本,图标)和命令逻辑(Execute,CanExecute方法).所有的代码,我能找到要么把文稿分为代码(通过创建一个RoutedCommand与像附加属性LabelIcon),或者把代码放到呈现(即,处理到的意见和代码隐藏).我也不喜欢.我认为演示应该完全在XAML中,代码应该完全在CS中(在ViewModel或Controller中).

问题:如何分离视图(XAML与对照其参考命令),命令呈现(标签,图标等等.对每一个指令)和(为C#代码命令的逻辑Execute,CanExecute在的ViewModels或控制器等)?

c# wpf xaml routed-commands mvvm

7
推荐指数
1
解决办法
419
查看次数

WPF中的多键手势

我有一个RoutedUICommandComment Selection. 我需要为此命令添加一个输入手势,就像在 VIsual Studio 中一样,即。( Ctrl+K, Ctrl+C)。我怎样才能做到这一点?请帮助我。(记住 VS 的功能)。

问候,贾瓦哈尔

wpf hotkeys routed-commands

6
推荐指数
2
解决办法
7851
查看次数

RoutedCommands Executed和PreviewExecuted事件

我的问题是我想在多个地方处理命令.例如,我有自定义的UserControl,其中Button被绑定到某个命令.我在该控件中有一个命令绑定,但我在一个使用该控件的Window中也有一个命令绑定.

我的目标是在控件内执行一些操作,同时不中断窗口中命令的处理.

我尝试过Executed和PreviewExecuted事件,但没有运气.然后我在一个窗口中模拟了问题(下面发布的代码).

<Window x:Class="CommandingEvents.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:CommandingEvents="clr-namespace:CommandingEvents" 
    Title="Window1" Height="300" Width="300">
<Window.CommandBindings>
    <CommandBinding 
        Command="{x:Static CommandingEvents:Window1.Connect}"
        Executed="CommandBindingWindow_Executed"
        PreviewExecuted="CommandBindingWindow_PreviewExecuted"/>
</Window.CommandBindings>
<Grid>
    <Grid.CommandBindings>
        <CommandBinding 
        Command="{x:Static CommandingEvents:Window1.Connect}"
        Executed="CommandBindingGrid_Executed"
        PreviewExecuted="CommandBindingGrid_PreviewExecuted" />
    </Grid.CommandBindings>
    <Button Command="{x:Static CommandingEvents:Window1.Connect}" 
            CommandTarget="{Binding RelativeSource={RelativeSource Self}}"
            Content="Test" HorizontalAlignment="Center" VerticalAlignment="Center" />
</Grid>
Run Code Online (Sandbox Code Playgroud)

namespace CommandingEvents
{
    public partial class Window1
    {
        public static readonly RoutedUICommand Connect = new
            RoutedUICommand("Connect", "Connect", typeof(Window1));

        public Window1()
        {
            InitializeComponent();
        }

        private void CommandBindingWindow_Executed(object sender, ExecutedRoutedEventArgs e)
        {
            Console.WriteLine("CommandBindingWindow_Executed");
            e.Handled = false;
        }

        private void CommandBindingGrid_Executed(object sender, ExecutedRoutedEventArgs e)
        { …
Run Code Online (Sandbox Code Playgroud)

wpf routed-commands

6
推荐指数
1
解决办法
2583
查看次数

路由表中的环回

我正在开发一个项目,在 VMWare 来宾中使用 FreeBDS 创建一个 WAN 模拟器,该虚拟机配置为在主机操作系统与其普通网关路由器之间路由流量。我计划修改主机上的路由表,以便正确重定向其流量,并在来宾中使用 ipfw 来修改各种网络特征。

在 Windows 7 中,我可以使用“ROUTE -f”完全清除路由表,但之后我无法为环回地址重新创建路由。

这是我在使用“ROUTE -f”清除之前的路由表:

===========================================================================
Interface List
 10...00 1c c0 ea c9 c2 ......Realtek RTL8168D/8111D Family PCI-E Gigabit
 Ethernet NIC (NDIS 6.20)
 18...00 50 56 c0 00 01 ......VMware Virtual Ethernet Adapter for VMnet1
 20...00 50 56 c0 00 08 ......VMware Virtual Ethernet Adapter for VMnet8
  1...........................Software Loopback Interface 1
 11...00 00 00 00 00 00 00 e0 Microsoft ISATAP Adapter
 12...00 00 00 00 00 00 00 …
Run Code Online (Sandbox Code Playgroud)

vmware routes routed-commands loopback-address windows-7

6
推荐指数
1
解决办法
1万
查看次数

在WPF DataGrid中实现自定义复制和粘贴,当它没有行时可以工作

我需要为WPF应用程序中的网格之间的数据实现数据(非文本或CSV)的自定义复制+剪切+粘贴.使用标准ApplicationCommands并定义CommandBinding非常有效,但前提是DataGrid包含至少1行数据以及何时选择.当没有行或焦点不在任何行上时,所有命令都被禁用.

为了解决这个问题,我尝试在DataGrid上调用CommandManager.InvalidateRequerySuggested()并设置Focusable = true和/或FocusManager.IsFocusScope = true,但似乎内部DataGrid作为一个整体在处理复制/粘贴操作时"不感兴趣",只有它的行正在重新查询命令CanExecute状态并相应地调用Execute.它也忽略了KeyBindings.

如何让DataGrid处理重新查询ApplicationCommands?

请找到我在下面测试问题的示例:

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <DataGrid x:Name="TheGrid">
        <DataGrid.Columns>
            <DataGridTextColumn Header="Number" Binding="{Binding}"/>
        </DataGrid.Columns>
        <DataGrid.InputBindings>
            <KeyBinding Key="A" Command="{x:Static ApplicationCommands.New}"/>
        </DataGrid.InputBindings>
        <DataGrid.CommandBindings>
            <CommandBinding Command="{x:Static ApplicationCommands.Paste}" CanExecute="CanPaste" Executed="Paste"/>
            <CommandBinding Command="{x:Static ApplicationCommands.Copy}" CanExecute="CanCopy" Executed="Copy"/>
            <CommandBinding Command="{x:Static ApplicationCommands.New}" CanExecute="CanAddNew" Executed="AddNew"/>
        </DataGrid.CommandBindings>
        <DataGrid.ContextMenu>
            <ContextMenu>
                <MenuItem Command="{x:Static ApplicationCommands.Copy}" Header="Copy"/>
                <MenuItem Command="{x:Static ApplicationCommands.Paste}" Header="Paste"/>
                <MenuItem Command="{x:Static ApplicationCommands.New}" Header="New row"/>
            </ContextMenu>
        </DataGrid.ContextMenu>
    </DataGrid>
</Window>
Run Code Online (Sandbox Code Playgroud)

而背后的代码:

using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Windows;
using System.Windows.Input;

namespace WpfApplication1
{
    public partial class MainWindow …
Run Code Online (Sandbox Code Playgroud)

c# wpf routed-commands commandbinding wpfdatagrid

6
推荐指数
1
解决办法
1万
查看次数

WPF使用自定义RoutedUICommands还是简单的事件处理程序?

我今天正在和某人谈论如何在他们的WPF程序中选择如何处理逻辑的设计模式,并希望SO社区可以帮助提供进一步的建议以使决策更容易.支持命令的哪些因素超过了不便之处?

我准备了一个完整的示例以及前三种方法的一些UML图:

  1. 在按钮和菜单上使用Click事件处理程序.
  2. 使用XAML中绑定的命令.
  3. 使用绑定在代码中的命令,保留XAML以实现纯GUI布局和样式.

他上过的入门课程和许多书籍都展示了简单的Click事件处理程序,作为将逻辑连接到UI对象的自然方式.

在使用代码隐藏文件中创建的命令时使用命令所需的开销量让他感到有些惊讶:

public static readonly ICommand cmdShow2 = new RoutedUICommand(
  "Show Window2", "cmdShow2", 
  typeof(TestDespatchWindow));
Run Code Online (Sandbox Code Playgroud)

然后在XAML中使用罗嗦的方式编写更多代码,必须识别和绑定命令:

<Window x:Class="WPFDispatchDemo.TestDespatchWindow"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:w="clr-namespace:WPFDispatchDemo"..>

    <Window.CommandBindings>
      <CommandBinding Command="{x:Static w:TestDespatchWindow.cmdShow2}"
        Executed="OnShow2" />
    </Window.CommandBindings>
      <DockPanel>
        <StackPanel Margin="0,8,0,0">
          <Button x:Name="Show2EventBased" 
                  Margin="10,2,10,2" 
                  Click="OnShow2" 
                  Content="Show2 via WPF Event"/>
          <Button x:Name="Show2Command" 
                  Command="{x:Static w:TestDespatchWindow.cmdShow2}"
                  Margin="10,2,10,2" 
                  Content="Show2 via WPF"/>
        </StackPanel>
    </DockPanel>
  </Window>
Run Code Online (Sandbox Code Playgroud)

我不能(还)声称自己是WPF专家,所以我可能把事情描绘得比实际情况更复杂,但我怀疑你不能简化事情而不是上述事情.

编辑:

我在DelegateCommand,RoutedCommand和Event之间找到了一个有趣的三向比较.

wpf xaml routed-commands

5
推荐指数
1
解决办法
8745
查看次数