- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
如标题所述,在使用属性元素语法时,我无法使 KeyBinding
工作。我所说的工作是指使用 Ctrl+Del
组合键来更改列表框的背景颜色。可以使用组合键或单击按钮,两者都会调用命令,但永远不会调用命令。在 Debug模式下设置断点时,它永远不会遇到。
我关注了 InputBinding Class example从文档中获取,并且只能在使用 UserControl
时让 KeyBinding
工作,并且想了解为什么,以及什么 我做错了。
下面是当使用属性元素语法声明的代码不起作用时的 MVCE。注释掉的是 UserControl
的一行,它封装了 StackPanel
并允许 KeyBinding
工作。取决于在 MainWindow.xaml.cs
的代码后面注释掉每个 PropertyElementSyntax
区域并取消注释每个 UserControlSyntax
区域。
主窗口.xaml:
<Window x:Class="LearningKeyBindingWPFApp.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:LearningKeyBindingWPFApp"
mc:Ignorable="d"
Title="MainWindow" Height="200" Width="300">
<!--<local:UserControl1 x:Name="CustomColorPicker" />-->
<StackPanel Margin="0,40,0,0">
<StackPanel.InputBindings>
<KeyBinding Command="{Binding ChangeColorCommand}"
CommandParameter="{Binding ElementName=ColorPicker, Path=SelectedItem}"
Key="{Binding ChangeColorCommand.Key}"
Modifiers="{Binding ChangeColorCommand.ModifierKeys}" />
<MouseBinding Command="{Binding ChangeColorCommand}"
CommandParameter="{Binding ElementName=ColorPicker, Path=SelectedItem}"
MouseAction="{Binding ChangeColorCommand.MouseAction}" />
</StackPanel.InputBindings>
<Button Content="Change Color"
Command="{Binding ChangeColorCommand}"
CommandParameter="{Binding ElementName=ColorPicker, Path=SelectedItem}" />
<ListBox Name="ColorPicker"
xmlns:sys="clr-namespace:System;assembly=mscorlib"
SelectedIndex="0">
<sys:String>Red</sys:String>
<sys:String>Green</sys:String>
<sys:String>Blue</sys:String>
<sys:String>Yellow</sys:String>
<sys:String>Orange</sys:String>
<sys:String>Purple</sys:String>
</ListBox>
</StackPanel>
</Window>
MainWindow.xaml.cs 的代码隐藏:
public MainWindow()
{
DataContext = this;
InitializeComponent();
InitializeCommand();
#region UserControlSyntax
//CustomColorPicker.ColorPicker.Focus();
#endregion
#region PropertyElementSyntax
ColorPicker.Focus();
#endregion
}
public SimpleDelegateCommand ChangeColorCommand { get; private set; }
private SolidColorBrush _originalColor;
private void InitializeCommand()
{
#region UserControlSyntax
//_originalColor = (SolidColorBrush)CustomColorPicker.ColorPicker.Background;
#endregion
#region PropertyElementSyntax
_originalColor = (SolidColorBrush)ColorPicker.Background;
#endregion
ChangeColorCommand = new SimpleDelegateCommand(ChangeColor)
{
Key = Key.Delete,
ModifierKeys = ModifierKeys.Control
};
}
private void ChangeColor(object colorString)
{
if (colorString == null)
{
return;
}
var selectedColor = SelectedColor((string)colorString);
#region UserControlSyntax
//if (CustomColorPicker.ColorPicker.Background == null)
//{
// CustomColorPicker.ColorPicker.Background = selectedColor;
// return;
//}
//CustomColorPicker.ColorPicker.Background = ((SolidColorBrush)CustomColorPicker.ColorPicker.Background).Color == selectedColor.Color
// ? _originalColor
// : selectedColor;
#endregion
#region PropertyElementSyntax
if (ColorPicker.Background == null)
{
ColorPicker.Background = selectedColor;
return;
}
var isColorIdentical = ((SolidColorBrush)ColorPicker.Background).Color == selectedColor.Color;
ColorPicker.Background = isColorIdentical
? _originalColor
: selectedColor;
#endregion
}
private SolidColorBrush SelectedColor(string value)
{
#region UserControlSyntax
//var selectedColor = (Color)ColorConverter.ConvertFromString(value);
#endregion
#region PropertyElementSyntax
var selectedColor = (Color)ColorConverter.ConvertFromString((string)ColorPicker.SelectedItem);
#endregion
return new SolidColorBrush(selectedColor);
}
最佳答案
问题在于,在无UserControl
的情况下,DataContext
是在命令对象初始化之前设置的。
WPF 具有强大的绑定(bind)系统,但它通常依赖于通过 INotifyPropertyChanged
进行的属性更改通知。只要您获得正确的操作顺序,某些场景在没有它的情况下也可以工作。但是,如果没有属性更改通知,如果您错过了向 WPF 提供某些属性值的机会窗口,它不会稍后再试。
当您使用 UserControl
时,UserControl
的绑定(bind)初始化发生在您设置 ChangeColorCommand
属性之后。这只是 WPF 如何初始化 UI 树中的各种对象的产物。但这意味着当 UserControl
的绑定(bind)查看 ChangeColorCommand
属性时,它具有您想要的值。
另一方面,当您将 StackPanel
显式放入窗口的 XAML 中时,为 WPF 设置属性以查看它时为时已晚。它已经在 InitializeComponent()
调用期间解析了这些绑定(bind)。稍后设置该属性无效。
根据您现在拥有的代码,您可以通过多种方式解决该问题:
DataContext = this;
的赋值移动到调用 InitializeCommand()
之后。更新 DataContext
也需要 WPF 更新所有依赖绑定(bind),因此在 InitializeCommand()
调用之后执行此操作可确保属性具有您想要的值。MainWindow
类中实现 INotifyPropertyChanged
,并在设置时引发 ChangeColorCommand
属性的 PropertyChanged
事件它。这将使 WPF 知道该值已更改,并且它应该重新评估依赖于它的任何绑定(bind)。综上所述,我会更进一步:
INotifyPropertyChanged
和 ChangeColorCommand
实现适当的 View 模型对象,并使用 that 作为数据上下文。让您的 UI 对象执行双重任务,因为 UI 和属性绑定(bind)源(即 View 模型的工作)不适合普通的 WPF 模型,牺牲了 MVVM 通常提供的好处,当然也引入了这种奇怪的计时属性绑定(bind)未按预期工作的原因并不明显。
好的,从技术上讲,您可以采用第四种方法,即在 InitializeComponent()
之前调用 InitializeCommand()
。其主要问题是,目前,它依赖于直接检索 UI 对象的属性值,并且该 UI 对象只有在调用 InitializeComponent()
之后才会存在。
这让我回到上面的 #3 选项。事实上,您不应该直接访问 UI 对象属性。这应该是你的 View 模型中的另一个属性,你应该更直接地选择初始颜色应该是什么,而不是在启动时从 UI 中获取它。
我承认,这里的设计有一些回旋余地,但您应该尽量让 View 模型和 UI 代码彼此分离。
关于c# - KeyBinding 用作 UserControl,但在 XAML 中使用属性元素语法时不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57103538/
我有以下查询: SELECT I.InsuranceID FROM Insurance I INNER JOIN JobDetail JD ON I.AccountID = JD.AccountID
我想在 SwiftUI 布局中将此函数用作具有不可变值的模板,但得到错误 Result of call to 'padding' 未使用: func keys (padding: CGFloat, t
直到最近我才使用 View 的标签元素,此后发现了一些很酷的用途。我遇到了一个不寻常的问题,希望有人能回答。这可能比 Android 更通用,但我不确定。它与 Java 如何处理 Integer 类有
这个问题在这里已经有了答案: What is the purpose of the var keyword and when should I use it (or omit it)? (19 个回
我有以下脚本(见下文)。我有两个问题: 1.在 Knockoutjs 的上下文中,下面这行是什么意思? ko.observable(null); 2.如何调用这里尚未定义的函数: that.activ
Java 社区中是否存在一种使用 with-repect-to 在方法中使用多个返回的思想流派,如下所示: public SomeClass someMethod(int someValue) {
我一直在尝试为我的网站创建一个小型社交媒体栏。出于某种原因,我无法计算出我想用来创建 Sprite 的图像无法加载。我还应该提一下,我在背景图像不显示方面遇到过类似的问题。 HTML调用是这样的:
我正在尝试使用 std::pair 枚举值作为 unordered_map 容器的键,但我在定义自定义哈希函数时遇到困难。 我尝试了以下方法: // Enum and pair declaration
我正在学习 JS/JQuery 以及匿名函数和闭包。我见过这样的例子: $('.button').click(function(){ /* Animations */ /* Other
我正在尝试使用菜单列表来浏览我的应用程序。尽管应用程序和路由运行良好,但我使用这段代码在控制台中收到了一些警告: {props.itemList.map((item, index) =>(
我只是想创建一个简单的测试,我在其中使用 DelegateHandlers 来实例化一个 HttpClient 而无需引入 Asp.net Core 包。我有 2 个删除处理程序 Throttling
我是answering another question在这里,用户有一个 ListView与 ItemsSource包含 UserControls .我说我不会推荐它,并被问为什么。 这真的让我很惊
我安装了3.5.2和 3.5.3使用 pyenv 的版本。 # pyenv versions * system (set by /usr/local/pyenv/version) 3.5.2
我正在使用 android studio 制作统一插件,但这里有问题。一些 SDK 提供仅使用 AppcompatActivity 来制作 fragment 但我的MainActivity , 正是
我在 Laravel 中使用 whereHas 来构建查询: })->whereHas('results', function ($query) use ($issued, $mode, $reque
我有一个 5Gb .dat 文件(> 1000 万行)。每行的格式如 aaaa bb cccc0123 xxx kkkkkkkkkkkkkk或 aaaaabbbcccc01234xxxkkkkkkkk
我有一个消费者类,它采用 NSInputStream 作为参数,它将被异步处理,并且我想推送来自生产者类的数据,该生产者类要求它提供 NSOutputStream 作为其输出源。现在我如何设置一个缓冲
我正在尝试使用 ENVs在 Symfony2 中设置我的参数。标量值很简单,但我有一些参数是数组,我需要使用 ENV 以某种方式设置它们。 有问题的参数: parameters: redis.se
在我的类作业中,我已经成功地做到了这一点,但只是在非常简单的程序中。今天,我有一个更复杂的程序,在我将 DEBUG 定义为一个符号后,Eclipse 做了可怕的笨拙的事情,并且在我删除定义后这些可怕的
我目前有 2 个复选框类别、一个下拉列表和一个表单中的提交按钮。该按钮应保持“禁用”状态,直到选中 A 类的一个复选框和选中 B 类选项之一并选择选择列表中的一个选项。它适用于复选框(当我在没有列表的
我是一名优秀的程序员,十分优秀!