gpt4 book ai didi

c# - 从包含的用户控件为窗口中的某些控件设置样式

转载 作者:可可西里 更新时间:2023-11-01 08:44:52 24 4
gpt4 key购买 nike

我有一个应用程序,其中包含在某些窗口中使用的多个用户控件。这些用户控件之一定义此窗口中的所有其他用户控件是否应允许编辑,因此将所有 CheckBoxIsEnabled 属性设置为 FalseComboBoxButton。然而,TextBoxes 应该允许复制它们的文本,因此不应该被禁用,而只是只读的。

我尝试遍历LogicalTree,但是一些自建的用户控件没有任何禁用它们的属性,但是这个用户控件中包含的控件只有按钮和文本框。这就是为什么我尝试将样式应用于所有可变元素(CheckBoxComboBoxButtonTextBox),但是它不会起作用。

在用户控件的 Ressources 部分我定义了一些样式:

<Style TargetType="Control" x:Key="disabledStyle">
<Setter Property="IsEnabled" Value="False" />
</Style>
<Style TargetType="TextBox" x:Key="readOnlyStyle">
<Setter Property="IsReadOnly" Value="True" />
</Style>

在 CodeBehind 中,检查条件后,我尝试了以下操作:

# windowOwner is the root window containing this usercontrol
for control in [Button, ComboBox, CheckBox]:
if self.windowOwner.Resources.Contains(control):
self.windowOwner.Resources.Remove(control)
self.windowOwner.Resources.Add(control, self.Resources['disabledStyle'])

if self.windowOwner.Resources.Contains(TextBox):
self.windowOwner.Resources.Remove(TextBox)
self.windowOwner.Resources.Add(TextBox, self.Resources['readOnlyStyle'])

但是什么也没发生。我究竟做错了什么?我应该采取不同的做法吗?

=编辑 1============================================ ======================

我现在尝试了以下 XAML:

<Style x:Key="disabledStyle">
<!--<Setter Property="Button.IsEnabled" Value="False" />
<Setter Property="CheckBox.IsEnabled" Value="False" />-->
<Setter Property="ComboBox.IsEnabled" Value="False" />
<Setter Property="TextBox.IsReadOnly" Value="True" />
</Style>

代码隐藏:

self.windowOwner.Style = self.Resources['disabledStyle']

令人惊讶的是,尽管 IsEnabled 属性仅为 ComboBox 设置,但所有内容都被禁用。如果我只设置 TextBox.IsReadOnly 属性,则什么也不会发生。有人可以解释一下吗?

=编辑 2============================================ ======================

我现在也尝试使用转换器:

(XAML)

<Style TargetType="Control" x:Key="disabledStyle">
<Setter Property="IsEnabled" Value="False" />
<!--<Setter Property="Button.IsEnabled" Value="False" />
<Setter Property="CheckBox.IsEnabled" Value="False" />
<Setter Property="ComboBox.IsEnabled" Value="False" /> -->
<Style.Triggers>
<DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Converter={StaticResource typeConverter}}" Value="True">
<Setter Property="IsEnabled" Value="True" />
<Setter Property="TextBox.IsReadOnly" Value="True" />
</DataTrigger>
</Style.Triggers>
</Style>

(转换器)

public class TypeConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
bool res = value.GetType() == typeof(TextBox);
return res;
}

public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{ // Don't need any convert back
return null;
}
}

但同样,所有内容都被禁用(或者如果您使用注释掉的变体则什么也不会发生)。

我在遍历可视化树时得到了它:

visited = set()

def disableControls(control):
visited.add(control)
try:
for childNumber in xrange(VisualTreeHelper.GetChildrenCount(control)):
child = VisualTreeHelper.GetChild(control, childNumber)

if hasattr(child, 'Content') and child.Content not in visited:
disableControls(child.Content)
if type(child) in [Button, ComboBox, CheckBox]:
child.IsEnabled = False
elif type(child) == TextBox:
child.IsReadOnly = True
elif child not in visited:
disableControls(child)
except:
pass
disableControls(self.windowOwner)

但我也希望以后能够将更改重置为原始状态。这意味着我必须保存所有更改,这使得这比它应该的复杂得多。我没主意了。

最佳答案

我认为删除样式并添加新样式不会通知控件应用新样式。

您应该直接在控件上设置样式,例如:

self.MyControl.Style = self.Resources['readOnlyStyle'] as Style

语法可能不同,但我是 C# 专家。

关于c# - 从包含的用户控件为窗口中的某些控件设置样式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35132298/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com