wpf '{DependencyProperty.UnsetValue}'不是属性'FocusVisualStyle'的有效值

9nvpjoqh  于 2022-12-14  发布在  其他
关注(0)|答案(5)|浏览(249)

我有一个奇怪的错误,我试图调试没有运气。
我已经子类化了hwndhost显示一些内容,我在那个类中有下面的函数来设置为全屏:

private void SetFullScreen(bool enable)
    {
        if (enable)
        {
            fs = new Window();
            fs.ResizeMode = ResizeMode.NoResize;
            fs.WindowState = System.Windows.WindowState.Maximized;
            fs.WindowStyle = System.Windows.WindowStyle.None;
            fs.Topmost = true;
            fs.PreviewKeyDown += delegate(object sender, KeyEventArgs e) { 
                if (e.Key==Key.Escape)
                    FullScreen = false;
            };
            fs.Show();
        }
        else
        {
            fs.Close();
            fs = null;
        }
    }

这在我的原型WPF应用程序中运行良好,但当我在主应用程序中使用此代码时,在关闭窗口(escape键)和fs.close()调用时出现此错误:
'{DependencyProperty.UnsetValue}' is not a valid value for property 'FocusVisualStyle'.
奇怪的是,它发生在窗口关闭后大约1500 ms。我试过将fs上的FocusVisualStyle设置为null,但它看起来像是其他东西。直觉是,它试图聚焦我的应用程序中没有此属性的另一个元素,但我真的不知道!
谢谢你!
编辑。问题是全屏按钮上FocusVisualStyle的自定义设置。我设置为{x:Null},问题就消失了。

gpfsuwkq

gpfsuwkq1#

当样式指向不存在StaticResource时,可能会发生这种情况。
此xaml失败:

<Grid.Resources>
    <Style TargetType="{x:Type TextBox}">
        <Setter Property="Height" Value="{StaticResource StandardControlHeight}"/>
        <Setter Property="VerticalContentAlignment" Value="Center"/>
    </Style>
</Grid.Resources>

错误为:
系统操作无效异常:“{DependencyProperty.UnsetValue}”不是属性“Height "的有效值。
当我添加缺少的StaticResource时,问题就消失了。

dy1byipe

dy1byipe2#

我的猜测是,当您关闭上述窗口时获得焦点的控件具有您设置的自定义样式,该样式不包括任何FocusVisualStyle。
因此,为了进一步帮助您,您应该再多解释一些:关闭此窗口时会发生(或应该发生)什么?
什么控件类型应该获得焦点?

mzmfm0qo

mzmfm0qo3#

另一种导致上述异常的方法是在使用StaticResource之后声明它,例如在样式声明中。

错了

<Style TargetType="Label">
    <Setter Property="Foreground" Value="{StaticResource BlueAccent}"/>
</Style>

<SolidColorBrush x:Key="BlueAccent" Color="#22afed"/>

正确

<SolidColorBrush x:Key="BlueAccent" Color="#22afed"/>

<Style TargetType="Label">
    <Setter Property="Foreground" Value="{StaticResource BlueAccent}"/>
</Style>
0h4hbjxa

0h4hbjxa4#

如果你在这里通过谷歌搜索问题标题:导致此异常的另一种方法是使用Trigger,但忘记设置Value
示例:

<ControlTemplate.Triggers>
  <Trigger Property="IsEnabled">
    <Setter Property="Background" Value="Gray" />
  </Trigger>
</ControlTemplate.Triggers>

这将导致XamlParseException,其中内部异常为:
'{DependencyProperty.UnsetValue}'不是属性'IsEnabled'的有效值。
更正:

<ControlTemplate.Triggers>
  <Trigger Property="IsEnabled" Value="False">
    <Setter Property="Background" Value="Gray" />
  </Trigger>
</ControlTemplate.Triggers>
06odsfpq

06odsfpq5#

另一种情况是声明了StaticResource,但在提及时未看到
例如,在我的案例中:
'{DependencyProperty.UnsetValue}'不是属性'Background'的有效值。
App.xaml.cs文件中的OnStartup方法处、应用程序启动之前发生。
异常消息提到了Background属性,它说明:
在一些

<Setter Property="Background" Value="{StaticResource xxx}" />

Background="{StaticResource xxx}"

WPF开始在层次结构中查找xxx,如果出现类似

<SolidColorBrush x:Key="xxx">yyy</SolidColorBrush>

则将发生异常。
在我的情况下,我已经把我的风格在一个单独的项目,它是这样的:

- SharedModule
    - SharedResources.xaml <---- this will be in App.xaml/MergedDictionaries 
        - MergedDictionaries
            - ButtonStyles.xaml <---- xxx was defined and used here
            - ToggleButtonStyles.xaml <--- xxx was used here as well

我以为ToggleButtonStyles.xaml中的样式会看到xxx,因为声明的顺序(ButtonStyles.xaml在上面,将在ToggleButtonStyles.xaml之前合并),结果是错误的!

解决方案1.

StaticResource替换为DynamicResource

<Setter Property="Background" Value="{DynamicResource xxx}" />

这样,如果在启动时没有找到xxx,WPF将不会引发异常,但它将在以后按预期使用它。

解决方案2.

将所有颜色提取到一个单独的ResrouceDictionary中,并将其合并到App.xaml中SharedResources.xaml之前

- Application
    - App.xaml
        - ResourceDictionary
            - MergedDictionaries
                - Colors.xaml <--- xxx is defined one level above SharedResources/MergedDictionaries
                - SharedResources.xaml

相关问题