Tag: wpf

如何在树视图的代码中设置WPF datatemplate?

struct Drink { public string Name { get; private set; } public int Popularity { get; private set; } public Drink ( string name, int popularity ) : this ( ) { this.Name = name; this.Popularity = popularity; } } List coldDrinks = new List ( ){ new Drink ( “Water”, 1 ), new Drink […]

WPF Datagrid对具有null元素的列进行排序

我有一个WPF Datagrid,我正在使用多个列。 其中一列有一些有时为null的元素,当我尝试对此列进行排序时会导致exception。 列的定义类似于: 如果我对Field1列进行排序就可以了,如果我对Field2列进行排序并且没有空的Field2对象就可以了,但有时会有并且DataGrid尝试对SubField进行排序(我猜)并且遇到一个空exception: System.InvalidOperationException was unhandled Message=The SortDescriptions added are not valid. The probable solutions are to set the CanUserSort on the Column to false, or to use SortMemberPath property on the Column, or to handle the Sorting event on DataGrid. 我已经尝试将SortMemberPath设置为“MyObject.Field2.SubField”,但当然这并没有解决它,因为Field2有时仍然为null。 我想知道尝试使用转换器,我设置SortMemberPath并让转换器返回string.empty为任何null元素,但无法使其工作。 我也尝试在这些列的绑定中添加“TargetNullValue = {x:Static sys:String.Empty}”,但它仍然无效。 任何意见/建议将非常感谢。 谢谢,威尔

RoutedUICommand PreviewExecuted Bug?

我正在使用MVVM设计模式构建应用程序,我想使用ApplicationCommands类中定义的RoutedUICommands。 由于View的CommandBindings属性(读取UserControl)不是DependencyProperty,因此我们无法将ViewModel中定义的CommandBindings直接绑定到View。 我通过定义一个抽象的View类来解决这个问题,该类基于ViewModel接口以编程方式绑定它,该接口确保每个ViewModel都有一个ObBableCollection的CommandBindings。 这一切都很好,但是,在某些情况下我想执行在不同类(View和ViewModel)相同命令中定义的逻辑。 例如,保存文档时。 在ViewModel中,代码将文档保存到磁盘: private void InitializeCommands() { CommandBindings = new CommandBindingCollection(); ExecutedRoutedEventHandler executeSave = (sender, e) => { document.Save(path); IsModified = false; }; CanExecuteRoutedEventHandler canSave = (sender, e) => { e.CanExecute = IsModified; }; CommandBinding save = new CommandBinding(ApplicationCommands.Save, executeSave, canSave); CommandBindings.Add(save); } 乍一看,前面的代码是我想要做的,但是文档绑定到的View中的TextBox只在它失去焦点时才更新它的Source。 但是,我可以通过按Ctrl + S保存文档而不会失去焦点。 这意味着文档在源中更新的更改之前保存,实际上忽略了更改。 但是,由于性能原因将UpdateSourceTrigger更改为PropertyChanged不是一个可行的选项,因此在保存之前必须强制更新。 所以我想,让我们使用PreviewExecuted事件强制更新PreviewExecuted事件,如下所示: //Find the […]

WPF:两个DataGrids,相同的ItemsSource,一个IsReadOnly,Bug?

我有一个WPF应用程序,它有两个共享相同ItemsSource的DataGrids。 当我将DataGrid的一个IsReadOnly属性设置为true时,我将无法将记录添加到其他DataGrid。 我仍然可以编辑第二个数据网格的内容,但只是无法添加记录。 这是有意的吗? 有没有办法解决这个问题? 我可以对DataGrid使用IsEnabled =“False”,但我失去了滚动它的能力。 这是设置: XAML: C#: public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); List persons = new List(); persons.Add(new Person() { FirstName = “Bob”, LastName = “Johnson” }); persons.Add(new Person() { FirstName = “John”, LastName = “Smith” }); dgA.ItemsSource = persons; dgB.ItemsSource = persons; } class Person […]

KeyedCollection和d:DataContext设计错误

请参阅下面的VS2013更新。 当使用类作为暴露KeyedCollection的d:DesignInstance ,XAML设计器会抱怨以下警告: 提供的generics参数的数量不等于generics类型定义的arity。 参数名称:instantiation 可以使用以下简单程序重现该问题: namespace Test { public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); } } public class MyClass { public KeyedCollection SettingsModule { get; private set; } } } 我无法为暴露KeyedCollection任何类提供设计时形状。 有什么想法在这里发生了什么? 更新:从VS2013开始,设计人员处理KeyedCollection的行为已经改变(尽管仍未完全发挥作用)。 上面的示例不再生成错误。 但是,如果KeyedCollection使用某些类型(例如接口)作为TItem ,则会生成以下错误: 你调用的对象是空的。 请考虑以下示例: namespace Test { public partial class MainWindow : Window { public […]

如何在控件聚焦时不断显示工具提示?

如何在控件聚焦时不断显示工具提示? 我尝试过很多东西,似乎没什么用。 现在我有以下内容: Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. 它看起来应该非常简单,但事实并非如此。 为什么不? 我将工具提示的IsOpen属性绑定到文本框的IsKeyboardFocused属性。 因此,它应该在工具提示聚焦时显示。 为什么不呢?

WPF ContextMenu itemtemplate,menuitem中的menuitem

我有以下xaml: TestItemModel类仅包含IsSelected布尔属性和Header字符串属性。 TestItems是TestItemModels的列表。 数据绑定到contextmenu,但它在UI中反映为MenuItem中的MenuItem(具有额外的边距,使菜单非常大)。 我可以通过将DataTemplate中的MenuItem更改为TextBox来解决这个问题,但之后我再也无法绑定IsSelected(我需要可视化属性)。 我对此有几个问题: 为什么MenuItem中有MenuItem? 这对我来说没有意义,因为它没有绑定到menuitem列表而是绑定到TestItemModel列表。 我该如何解决这个问题?

在WPF中生成和绘制video的快速方法是什么?

我正在编写一个video播放器来播放由我们的ASIC捕获的帧。 它们采用自定义格式,并且我已经提供了解码ASIC状态的function。 video可以是640×480到2560×1200(!!!)的任何大小。 每个状态周期的输出是16×16像素块,我必须在屏幕上看到一个video。 每次需要更新屏幕时,我都会收到以下信息: 块宽 块高 块开始的X坐标 块开始的Y坐标 RGB32像素颜色信息的一维数组 主要限制: .NET 3.5 没有不安全的代码 我今天早上花了一些时间尝试WriteableBitmap,并将其用作Image的源代码,如下所示: private WriteableBitmap ImageSource; public MainWindow() { InitializeComponent(); ImageSource = new WriteableBitmap(FrameWidth, FrameHeight, 96, 96, PixelFormats.Bgr32, null); ImagePanel.Source = ImageSource; } private void DrawBox(byte Red, byte Green, byte Blue, int X, int Y) { int BoxWidth = 16; int BoxHeight = […]

事件源vs原始源

我正在阅读C#WPF书籍,在路由事件章节中,事件有2个相同的属性Source和OriginalSource 。 我没有看到它们之间的区别: XAML: 代码背后: private void Ok_Click(object sender, RoutedEventArgs e) { bool flag = false; var source = e.Source; var originalSource = e.OriginalSource; if (source == originalSource) { flag = true; } } 和flag属性在这里是true ,有人可以解释为什么2相同的属性或在这种情况下这个属性没有效果? 或者我们在哪里可以看到这个属性的用例?

摇动画(3D版)

我想在错误上使用这个动画,如下所示: 如何在wpf中实现这一点? 我觉得这应该是多个转换的组合(组合?),但是哪些以及如何确切? 这是一个启动器(mcve或称之为“我的尝试”),这是丑陋的,甚至不是我想要的: 周围有许多2d摇动帖( 点击 , 点击 ),但是我需要动画说“你错了”而不是说“让我跳舞”的动画。