Tag: wpf

如何双向将复选框绑定到标志枚举的单个位?

对于喜欢WPF绑定挑战的人: 我有一个近乎function的例子,双向绑定一个复选框到一个标志枚举的单个位(感谢Ian Oakes, 原始的MSDNpost )。 但问题是绑定的行为就好像它是一种方式(UI到DataContext,反之亦然)。 因此,复选框不会初始化,但如果切换,则数据源会正确更新。 Attached是定义一些附加依赖项属性的类,以启用基于位的绑定。 我注意到的是,即使我强制DataContext更改,也永远不会调用ValueChanged。 我尝试过:更改属性定义的顺序,使用标签和文本框确认DataContext正在冒泡更新,任何合理的FrameworkMetadataPropertyOptions(AffectsRender,BindsTwoWayByDefault),显式设置绑定模式= TwoWay,敲打墙头,改变如果发生冲突,ValueProperty到EnumValueProperty。 任何建议或想法将非常感谢,感谢您提供的任何东西! 枚举: [Flags] public enum Department : byte { None = 0x00, A = 0x01, B = 0x02, C = 0x04, D = 0x08 } // end enum Department XAML用法: CheckBox Name=”studentIsInDeptACheckBox” ctrl:CheckBoxFlagsBehaviour.Mask=”{x:Static c:Department.A}” ctrl:CheckBoxFlagsBehaviour.IsChecked=”{Binding Path=IsChecked, RelativeSource={RelativeSource Self}}” ctrl:CheckBoxFlagsBehaviour.Value=”{Binding Department}” class级: /// /// A […]

xaml中的条件元素取决于绑定内容

是否可以显示此TextBlock,仅当Address.Length > 0 ? 我想直接在xaml中执行此操作,我知道我可以以编程方式放置所有控件

绘制有向非循环图:最小化边缘交叉?

以树forms在DAG中布置顶点(即顶部没有内边的顶点,顶点仅依赖于下一层上的顶点等)相当简单,没有图形绘制算法,如Efficient Sugiyama。 但是,是否有一个简单的算法可以最大限度地减少边缘交叉? (对于某些图形,可能无法完全消除边缘交叉。)图片说千言万语,所以有一种算法会暗示没有交叉边缘的东西 。 ( 与此相比 )。 编辑:结果 我已经接受了Senthil的建议graphviz / dot – 快速浏览文档确认它很容易用作库或外部工具 ,并且输出格式非常容易解析 。 然而,我最终选择使用GraphSharp,因为我已经在使用.NET等(虽然它绝对不像dot那么强大)。 结果是“足够好”,并且通过一点边缘路由和调整可以做得更好(模糊文本是因为3.5 WPF )。 自动布局图http://public.blu.livefilestore.com/y1pEY8I95GtlzcxZzhDMhhKoUyejT_sVVZ4jlsDK2fdl6XAR4WV4-yuSesY6chXokmAZxdJXZ4Bv674TqwpT1-fOg/dag3.gif 这是完整的 C#代码(这是引用QuickGraph或GraphSharp的所有代码 – 是的;就这么简单): internal static class LayoutManager { private const string ALGORITHM_NAME = “EfficientSugiyama”; private const bool MINIMIZE_EDGE_LENGTH = true; private const double VERTEX_DISTANCE = 25; private const double LAYER_DISTANCE = 25; private […]

如何将焦点设置为WPF工具包datagrid的特定单元格

我正在使用WPF工具包提供的DataGrid控件来显示产品列表及其OpenStock,描述等。在这个DataGrid中,我将OpenStock列设置为可编辑,其余是不可编辑的。 我现在想要什么,当我的这个窗口加载,我想将键盘焦点设置为OpenStock列的第一个单元格,如果可能的话,在编辑模式下。 我搜索了这个2天,最后在这里发帖。 任何帮助或代码示例都会有所帮助。 非常感谢……..

禁用WPF窗口标题栏中的关闭按钮(C#)

我想知道如何禁用(不删除/隐藏)WPF窗口中的关闭按钮。 我知道如何隐藏它使窗口的标题栏看起来像这样: 但我想禁用它意味着它应该如下所示: 我在C#中编写脚本并使用WPF(Windows Presentation Foundation)。

为什么我不能将某些文件类型添加到VS2010项目中?

我正在尝试将WPF ResourceDictionary添加到刚刚创建的C#项目中。 该项目最初不是WPF项目,但现在我需要在其中包含一些WPF资源。 当我右键单击项目并选择“添加”时,ResourceDictionary不是一个选项。 即使我打开modal dialog并导航到ResourceDictionary类型应该在的位置(与其他WPF类型一起),它也不存在。 此外,当我手动将具有ResourceDictionary语法的XAML文件添加到项目时,我无法使用WPF Application.Load(uri)语法以编程方式加载它,所以我觉得VS2010阻止我添加文件是有原因的。 如何让我的项目“能够”添加ResourceDictionary而无需从头开始重新创建整个项目作为WPF项目并从头开始重新添加每个文件? 另外,什么定义了可以添加到项目中的文件类型,以便将来可以避免类似的问题? 希望它像我需要添加到AssemblyInfo.cs文件中的一行一样简单。

如何调整WPF DataGrid的大小以适应其内容?

目的 我想为DataGrid设置这样的大小(标准,来自WPF),因此所有单元格(文本)都是完全可见的。 我有一个带有DockPanel的窗口,里面有DataGrid,所以当我调整窗口大小时,所有嵌套的小部件(DockPanel和DataGrid)都会相应地resize。 示例(编辑-1) 假设您有100像素宽的窗口,并且您有一列DataGrid,该单元格是“快速棕色狐狸……”(400像素宽)。 因此,DataGrid应该调整为400像素(可能更多,因为填充),窗口也应该调整为400像素(由于填充也更多)。 我没有找到任何标准方法来做到这一点(AFAIK WPF提供了将内容剪辑到所需宽度的方法,我的问题正好相反),所以我提出了这样丑陋的解决方法,这不太合适。 解决方法 迭代DataGrid标头(假设它们只是字符串)并计算文本所需的宽度 迭代每列的DataGrid行(假设它们是TextBlock或TextBox)并计算文本所需的最大宽度 – 为TextBlock / TextBox添加水平填充,为DataGrid单元添加水平边距 对列的DataGrid ActualWidth和(2)中计算的最大宽度之间的所有差异求和 通过(3)中计算的差值增加窗口宽度 问题 我做了几次测试,在某些情况下计算出的宽度太大(这是一个小问题),因为有些情况太小了。 问题从它的核心过程开始 – 计算TextBox / TextBlock所需的宽度,计算出的宽度总是比它应该小1个单位(如果我将宽度设置为计算宽度,则始终剪切文本中的1个像素)。 那么我忽略了哪个因素呢? 或者更好 – 是否已经有一些方法可以调整DataGrid以适应其内容? 代码 计算文本所需的宽度(此处为TextBlock): public static double TextWidth(this TextBlock widget, string text) { var formattedText = new FormattedText(text, // can use arbitrary text System.Globalization.CultureInfo.CurrentCulture, widget.FlowDirection, widget.FontFamily.GetTypefaces().FirstOrDefault(), widget.FontSize, widget.Foreground); […]

View Model之间的WPF MVVM通信

我正在研究WPF MVVM应用程序,其中我有两个视图View1和View2及其各自的ViewModel。 现在,我希望单击View1中的按钮将关闭View1并使用ViewModel1打开View2。 此外,我想从ViewModel1打开时向ViewModel2传递一些人类实例,该实例将用于在View2中显示信息。 在ViewModels中实现这一目标的最佳方式和最简单方法是什么,我希望避免在代码后面编写导航代码。

将故事板放在应用程序资源中

我需要在几个地方使用相同的故事板,因此我将故事板放在我的Application.Resources中。 当我尝试执行故事板时,唯一的问题是我需要引用我想要动画的目标。 这是我的故事板: border2 我为不同对象的高度设置动画的方式是通过更改动态资源目标。 当故事板在当前窗口时,我能够这样做。 但是现在我想将它放在应用程序资源中,我不知道如何引用目标属性。 编辑 我之前发布的解决方案效果不错但有时很难用代码创建复杂的动画。 所以我解决的另一个替代解决方案是使用表达式混合创建故事板。 所以我将一个随机控件拖到表达式混合中的主窗口并创建一个随机动画。 让我们说动画出现为: 然后我复制该代码并将其粘贴到我的工作窗口而不是APP.XAML中。 然后在我的代码中让我说我有一个: 由于某种原因,变换组必须在那里才能为对象设置动画。 无论如何,让我们说我在工作窗口中有那个寄宿生,我想用我用表达式混合创建的相同动画来设置动画。 我将在代码中做的是: Storyboard sb1 = FindResource(“Storyboard1”) as Storyboard; foreach (var child in sb1.Children) { Storyboard.SetTargetName(child, brdBorder.Name); } sb1.Begin(this); 然后我能够在我的工作窗口上设置该边框的动画。 这个很好的部分是我能够将相同的动画应用于多个对象(这是我认为创建资源的目的)当我尝试将故事板放在资源字典或app.xaml中时问题就出现了。文件。 当我这样做时,c#能够找到故事板,但故事板的属性是只读的,因此我得到错误: Cannot set a property on object ‘System.Windows.Media.Animation.DoubleAnimationUsingKeyFrames’ because it is in a read-only state. 我想要这样做的原因是将相同的动画应用于多个对象。 解决方案是使用代码构建基本动画,然后使用更复杂的动画(如缓动函数等)将其另存为资源。 让我告诉你我的意思。 在我的资源文件中,我放置了以下资源: 在expresion混合中,您可以构建更复杂的缓动function。 […]

绑定到DataContext的WPF Style DataTrigger不起作用

我有一个TextBox,其样式有一个DataTrigger,用于更改文本,如下所示: 但它不起作用,文本永远不会改为“Bar”。 我已经使用Text =“{Binding MyBool}”测试了另一个TextBlock,此文本从“False”变为“True”。 Snoop没有发现我能看到的错误,输出中没有任何内容。 这个问题似乎与WPF触发器绑定到MVVM属性的重复,但我的代码似乎与接受的答案不同( http://www.thejoyofcode.com/Help_Why_cant_I_use_DataTriggers_with_controls_in_WPF.aspx ,“使用样式”一节)任何相关的方式。 并且在实际答案中建议使用DataTemplate似乎是错误的,因为我只希望将其应用于单个TextBlock,但如果它是正确的,我不确定如何为此编写DataTemplate … 编辑: 这就是我绑定的属性看起来像: public bool MyBool { get { return _myBool; } set { if (_myBool== value) return; _myBool= value; NotifyPropertyChanged(); } } private bool _myBool;