【发布时间】:2020-01-27 07:03:39
【问题描述】:
我需要开发一个简单的 WPF 应用程序。在 UI 窗口中,左侧有标签和文本块,右侧有按钮。
基于配置设置(用户是左撇子还是右撇子)我需要切换控件,向左切换按钮,向右切换标签和文本块。
您能否推荐一个解决此要求的好方法?
【问题讨论】:
-
定义2个模板,根据配置选择合适的一个。那里有很多样品。
标签: wpf user-interface wpf-controls
我需要开发一个简单的 WPF 应用程序。在 UI 窗口中,左侧有标签和文本块,右侧有按钮。
基于配置设置(用户是左撇子还是右撇子)我需要切换控件,向左切换按钮,向右切换标签和文本块。
您能否推荐一个解决此要求的好方法?
【问题讨论】:
标签: wpf user-interface wpf-controls
取决于应用的范围可能是什么。
2 个备选方案:
1)
我认为随着应用程序的发展,它可能会不仅仅是按钮。
我可能会构建一个用户控件来封装标签和控件的这种行为。用户控件使用静态来决定文本块的位置,但看起来类似于以下行编辑控件:
https://gallery.technet.microsoft.com/WPF-Entity-Framework-MVVM-78cdc204
哪个是用户控件,其中有一个 contentpresenter,因此您可以将任何您喜欢的控件(例如按钮)“放入”其中并为标签设置依赖属性。
2)
定义 2 个内容控制模板,类似于这里使用的模板:
https://social.technet.microsoft.com/wiki/contents/articles/28597.aspx
将它们放在单独的资源字典中并给它们相同的键。
合并到 application.current.resources 适当的资源字典和样式。
看到这是一个应用程序设置,这大概是一个启动的事情。人们不只是动态地改变他们的“惯用手”。因此,您可能可以将它们用作静态资源。如果它们实际上会在运行时发生变化,那么我认为这会涉及更多,因为您需要强制重新渲染视图。
【讨论】:
正如@RajN 所说,2 模板可能是正确且时尚的解决方案。
您也可以定义一个有 2 列的网格并相应地切换每个控件的属性“Grid.Column”
【讨论】:
也许不是最好的方法,但我设法根据您的建议使用网格来实现这一点。谢谢大家的宝贵意见。
我切换了列并相应地更改了宽度。
if (AppSettings.IsLeft)
{
parentGrid.ColumnDefinitions[0].Width = new GridLength(400, GridUnitType.Pixel);
parentGrid.ColumnDefinitions[1].Width = new GridLength(1, GridUnitType.Star);
Grid.SetColumn(buttonGrid,0);
Grid.SetRow(buttonGrid,0);
Grid.SetColumn(contentGrid,1);
Grid.SetRow(contentGrid,0);
}
【讨论】: