【问题标题】:How to declare resource before Window in XAML?如何在 XAML 中的 Window 之前声明资源?
【发布时间】:2017-12-08 02:40:59
【问题描述】:

我的代码:

<Window ...
    Title="Notification" Height="90" Width="300" ResizeMode="NoResize" WindowStyle="None" DataContext="{Binding Notification, Source={StaticResource Locator}}" Opacity="{Binding TransitionOpacity}" Left="{Binding LeftMargin}" Top="{Binding TopMargin}"  Visibility="{Binding IsVisible, Converter={StaticResource BoolToVisibility}}">
<Window.Resources>
    <local:BoolToVisibleOrHidden x:Key="BoolToVisibility" />
</Window.Resources>
    <Grid Background="#FF3C4759">
    ...
</Window>

编译时出现异常 System.Windows.Markup.XamlParseException 并在将代码更改为

<Window ...
    Title="Notification" Height="90" Width="300" ResizeMode="NoResize" WindowStyle="None" DataContext="{Binding Notification, Source={StaticResource Locator}}" Opacity="{Binding TransitionOpacity}"  Left="{Binding LeftMargin}" Top="{Binding TopMargin}" >
<Window.Resources>
    <local:BoolToVisibleOrHidden x:Key="BoolToVisibility" />
</Window.Resources>
    <Grid Background="#FF3C4759" Visibility="{Binding IsVisible, Converter={StaticResource BoolToVisibility}}">
    ...
</Window>

它有效,但我想设置窗口可见性而不是网格。

【问题讨论】:

  • 您不能将数据绑定添加到静态资源。要么在资源中使用触发器来更改样式,要么不将网格声明为资源,而将其声明为普通元素并使用绑定。
  • “我想设置窗口可见性”是什么意思?是否要根据IsVisible 显示和隐藏窗口?
  • @ThomasFlinkow 是的
  • @XAMlMAX 在这种情况下如何?
  • @XAMlMAX 不,这无济于事。 Archer:不是“不显示”窗口,而是将WindowState 设置为WindowState.Minimized 解决方案?您当然也可以使用自定义转换器绑定到它。如果是,那么我将为您做一个工作示例。

标签: c# wpf mvvm data-binding mvvm-light


【解决方案1】:

在这种情况下,绑定窗口可见性可能不是一个好主意。如果您有一段时间后想要隐藏的通知 - 只需关闭它 (Close()) 而不是隐藏。

如果您仍然想这样做 - 将转换器放入您的应用程序(App.xaml 文件)。然后你就可以在Window.Visibility绑定中使用它了。截至目前 - 窗口Visibility 属性设置之前 Window.Resources 被初始化,所以你不能使用在Window.Resources 中创建的转换器。

另一种方法是像这样设置Visibility:

<Window.Resources>
    <local:BoolToVisibleOrHidden x:Key="BoolToVisibility" />
</Window.Resources>
<Window.Visibility>
    <Binding Path="IsVisible" Converter="{StaticResource BoolToVisibility}" />
</Window.Visibility>

【讨论】:

  • 谢谢,但我不想关闭通知,因为我想多次使用同一个窗口(当收到信使消息时)。如何将转换器放入 App.xaml?
  • @ArcheR &lt;Application x:Class="..." xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="..." StartupUri="Notification.xaml"&gt; &lt;Application.Resources&gt; &lt;local:BoolToVisibleOrHidden x:Key="BoolToVisibility"/&gt; &lt;/Application.Resources&gt; &lt;/Application&gt;
  • 还是不行(现在一直隐藏)
  • @ArcheR 很多事情都可能出错。您的转换器可能有误(反转),模型可能无法实现INotifyPropertyChanged,以及您未提供代码的任何其他内容。但转换器将以这种方式工作(注意 - 不再有 xaml 解析异常)。
  • 尝试将您的视图模型设置为窗口DataContext 之前调用窗口InitializeComponent()也。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-09
  • 1970-01-01
  • 2023-03-21
  • 1970-01-01
  • 2020-03-17
相关资源
最近更新 更多