Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何基于某些配置对WPF视图进行轻微修改_C#_Wpf_User Interface_Mvvm_Runtime - Fatal编程技术网

C# 如何基于某些配置对WPF视图进行轻微修改

C# 如何基于某些配置对WPF视图进行轻微修改,c#,wpf,user-interface,mvvm,runtime,C#,Wpf,User Interface,Mvvm,Runtime,我们有一个MVVM应用程序和一个要求(示例中简化了),即基于一个int属性的值,我们应该对视图进行轻微修改 例如,如果属性的值为1,我们应该更改一个视图按钮的背景色,如果值为2,我们应该隐藏一个标签,并将文本框的文本加粗,如果值为14,我们应该隐藏2个标签 由于值可以在构建应用程序后确定,因此我们希望类似于文件、在运行时加载的程序集以及反射,或者在不部署整个应用程序的情况下指定必须在视图上执行的操作 其主要思想是创建视图,在所有可用项上输入名称,并将其传递给在运行时加载的程序集中定义的类,该类将

我们有一个MVVM应用程序和一个要求(示例中简化了),即基于一个int属性的值,我们应该对视图进行轻微修改

例如,如果属性的值为1,我们应该更改一个视图按钮的背景色,如果值为2,我们应该隐藏一个
标签
,并将
文本框的文本加粗,如果值为14,我们应该隐藏2个
标签

由于值可以在构建应用程序后确定,因此我们希望类似于文件、在运行时加载的程序集以及反射,或者在不部署整个应用程序的情况下指定必须在视图上执行的操作

其主要思想是创建视图,在所有可用项上输入名称,并将其传递给在运行时加载的程序集中定义的类,该类将知道如何处理视图。我们在这种方法中看到的问题是,您需要为视图中的所有内容定义名称

您认为有更好的方法来满足需求吗?对视图所做的更改始终只是一些属性


提前谢谢。

好的,我已经考虑过了。。。与其保留对所有相关控件(不是很MVVM)的引用,不如使用
绑定更新这些控件?我有一个大型应用程序,其中有一个名为
StateManager
的类,它管理应用程序的全局状态。这个类使用一个
单例模式,它的实例在我的基本视图模型类中定义。这意味着我可以从任何视图模型访问它的所有属性,因此也可以从任何视图访问它

我想如果你有一个类似的类,你可以为你想要影响的每个控件放一个属性。例如,您可以设置
bool
属性来显示或隐藏各种控件(使用
booltVisibilityConverter
)。对于需要更改的
Background
属性的控件,可以具有
Brush
属性。您可以在其中添加
int
属性,并根据其值设置每个属性

在UI中,可以将每个控件绑定到此类中的属性:

<Button Content="Click" Background="{Binding ConfigurationManager.ButtonBackground}" />
<Label Content="Read" Visibility="{Binding ConfigurationManager.IsLabelVisible, 
    Converter={StaticResource BoolToVisibilityConverter}}" />

@vitaliyzadorozhnyy提出的解决方案实际上是可行的。我们经常这样工作。我们加载一个xaml文件,它就是一个xml文件,操纵xml文件,然后使用

XamlReader.Parse(TemplateString);
但就你而言,我认为这不是最好的解决办法。根据您需要支持的WPF版本,您可能会更好地使用
VisualStateManager

一般来说,您首先定义一系列VisualState,然后调用:

VisualStateManager.GoToState(control, "stateName", useTransition);
根据int值转到所需的配置

请注意,您需要WPF工具包才能使其正常工作。下面有一篇好文章:

很遗憾,这些值可以在运行时创建,因为如果不是这样,您可以将
绑定到
int
属性,以自动完成所有操作。如果您需要完全动态的UI,并且在构建/部署应用程序后做出决定,您也可以使用动态xaml-我的意思是定义视图(视图的一部分)在运行时应使用XamlReader加载的xaml中。因此,您以后可以使用另一个应用程序或运行时加载的dll修改此xaml。@Sheridan:同意,在这种情况下,解决方案很简单:(@vitaliyzadorozhnyy:问题是我们只需要修改一个现有元素。例如,更改一个现有元素的背景色。这可以用XamlReader来完成吗?我以前从未使用过它。也许你指的是可剥皮性。为了实现这一点,你必须使用资源。如果只有一个元素,你可以通过t没有包含资源字典的整个资源文件,并且仅使用到可用资源的绑定,例如动态更改的全局资源。如果是针对多个元素的属性,则可能会在资源字典中定义样式,如此链接中所示:或在此链接中所定义的样式。我感谢您的帮助,但不幸的是on不能工作,因为我们不知道在构建时会要求更改哪些内容,所以我们不知道要绑定哪些属性,这是需要在运行时解决的问题。这是否支持在构建应用程序后定义可视状态?我们不知道在构建时会有哪些状态,因为它们将在以后定义。您可以创建Vi在您的情况下,sualStates会根据您定义的参数动态地使用代码。请参阅此链接以获取示例:问题是如何引用视图中的元素,而不命名视图中的所有元素,以便我们可以从外部引用它们。WPF有一个VisualTree和一个LogicalTree,您可以通过使用根元素等方式进行遍历nt并递归到所有的子级,与他们是否被命名无关。有两个类对此有帮助:VisualTreeHelper和LogicalTreeHelper。请看以下内容:
VisualStateManager.GoToState(control, "stateName", useTransition);