gpt4 book ai didi

C# WPF 标签可见性异常

转载 作者:太空宇宙 更新时间:2023-11-03 20:18:35 25 4
gpt4 key购买 nike

我正在尝试根据组合框的选定值显示标签。我正在使用 VS2010。

代码如下:

private void pointsSettings_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
if (this.pointsSettings.SelectedValue.ToString() == "between")
{
pointsAboveLabel.Visibility = Visibility.Collapsed;
}
else
{
pointsAboveLabel.Visibility = Visibility.Visible;
}
}

XAML:

 <ComboBox Name="pointsSettings" SelectionChanged="pointsSettings_SelectionChanged">
<ComboBoxItem Content="between" />
<ComboBoxItem Content="above" IsSelected="True" />
<ComboBoxItem Content="below" />
</ComboBox>
<Label Content="points" Name="pointsAboveLabel" />
<Label Content="and" Name="pointsBetweenLabel" Visibility="Collapsed" />

这是我得到的错误: enter image description here文本显示:“未将对象引用设置为对象的实例”

我知道还有另一个问题与此非常相似 - 实际上有相同的错误 - 但是提供的解决方案(将变量初始化移动到 InitializeComponent() 方法调用之上)不适合我,因为我没有对象初始化。

我们非常感谢您提供的任何帮助。

最佳答案

发生这种情况是因为 pointsSettings_SelectionChanged 发生在 UI 完全初始化之前(您可以在调用堆栈中看到它来自 InitializeComponents() 调用)。因此标签尚未在 UI 中初始化,因此代码隐藏中指向该标签的变量为空。所以它实际上是与另一个问题相同的问题,但是初始化变量的是 WPF 框架,而不是你。

您的 XAML 是按顺序计算的,因此它会命中 ComboBox 并对其进行初始化(包括最初选择的值)并在标签初始化之前触发 SelectionChanged 事件。您会注意到,如果更改 XAML 的顺序,使 Label 高于 ComboBox,您将不会遇到问题,因为Label 将在事件触发之前初始化。

为了解决这个问题,我建议在 pointsSettings_SelectionChanged 方法中添加一个条件,以便在 pointsAboveLabel 为 null 时返回:

private void pointsSettings_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
if(pointsAboveLabel == null) return;
//rest of code
}

并且由于您在 ComboBox 中对最初选择的值进行硬编码,因此您可以对 Label 的初始 Visibility 进行硬编码.

但是您的代码中还有另一个问题 - ComboBoxSelectedValue 永远不会是字符串,因为您现在已经设置了它。 SelectedValue 将是一个 ComboBoxItem。为了查看您放入 ComboBoxItem 中的字符串值,您需要查看 Content 属性。所以你需要这样的东西:

ComboBoxItem item = pointsSettings.SelectedValue as ComboBoxItem;
if(item.Content.ToString() == "between")
{
...
}

关于C# WPF 标签可见性异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15094910/

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