我遇到了WPF绑定到静态属性的一些问题.在我的应用程序中有一个名为Globals的类,它包含ThisAddIn的静态属性.这个对象允许我访问一个User属性,它基本上是我想在我的Binding中使用的.所以,我的XAML看起来像这样:
<TextBlock Text="{Binding Path=User.Name
, Source={x:Static Member=s:Globals.ThisAddIn}}" />
Run Code Online (Sandbox Code Playgroud)
命名空间s由以下行在顶部声明:
xmlns:s="clr-namespace:ConsoleApplication16.Model"
Run Code Online (Sandbox Code Playgroud)
我发现了很多不同的方法,如何在XAML中引用静态属性,但除了这个之外没有一个工作,这对我来说似乎也是最合乎逻辑的.我发现的一些样本根本没有使用Path或Member.
经过一些测试后我找到了正确的方法,使用"x:Static Member"来定义你想要使用的类和静态属性,而Path在这个对象里面定义了正确的属性,就像普通绑定一样.
尽管此解决方案在没有任何抱怨的情况下进行编译,但会弹出XAMLParseException,直接告诉我StaticExtension值无法解析为枚举,静态字段或静态属性.
有没有办法通过Xaml访问My.Resources?
像这样
<Image Source="{Binding MyImage,
Source={x:Static my:Resources},
Converter={StaticResource MyBitmapToImageSourceConverter}}" />
Run Code Online (Sandbox Code Playgroud)
这是我得到的错误: \ Application.xaml(122,36):错误MC3029:'my:Resources'成员无效,因为它没有合格的类型名称.
以上情况当然不起作用.
注意:转换器仅用于说明.
我想到了一个想法,如果它可以工作,这可能是一个好方法,我为资源创建了一个包装类:
Public Class Resources
Public Shared ReadOnly m_Resources As New Resources
Public Shared ReadOnly Property Resources() As Resources
Get
Return m_Resources
End Get
End Property
Public ReadOnly Property MyResources(ByVal name As String) As Object
Get
Return My.Resources.ResourceManager.GetObject(name)
End Get
End Property
End Class
Run Code Online (Sandbox Code Playgroud)
然后在我的绑定中,我试着像这样访问它:
<Setter Property="ImageSource"
Value="{Binding MyResources[Ok], Source={x:Static src:Resources.Resources}}"/>
Run Code Online (Sandbox Code Playgroud)
但我仍然收到以下消息:
System.Windows.Data错误:16:无法从''(类型'资源')获取'MyResources'值(类型'对象').BindingExpression:路径=为MyResources [确定]; DataItem ='Resources'(HashCode = 59109011); target元素是'Image'(Name ='btnOk'); target属性为'Source'(类型'ImageSource')TargetParameterCountException:'System.Reflection.TargetParameterCountException:参数计数不匹配.
顺便说一下,我在MyResources Getter中放置了一个测试MessageBox,似乎根本没有访问该属性.
我将一些图像作为资源添加到我的 WPF 项目中,将它们的构建操作更改为Resource在解决方案资源管理器中并将它们添加到我的主窗口中,如下所示:
<Image ... Source="Resources/user.png"/>
Run Code Online (Sandbox Code Playgroud)
一切正常,直到我从我的解决方案中添加和删除一个项目,然后这些图像停止在设计和运行时显示。<Image Source/>XAML 编辑器中的标记和错误列表现在显示消息:
找不到路径“C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\Resources\user.png”的一部分。
我尝试重新启动 Visual Studio 和计算机,并对其进行清理和重建,但我仍然没有得到图像。
我正在尝试向 wpf 窗口添加图标,但每当我向代码中添加以下行时,我都会收到 xaml 解析异常:
Icon="myIcon.ico"
Run Code Online (Sandbox Code Playgroud)
我的窗口标签看起来像这样(并且运行良好),没有 Icon 属性:
<Window x:Class="MyProject.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:MyProject"
mc:Ignorable="d"
Title="My Project" Height="562.356" Width="1058.204">
Run Code Online (Sandbox Code Playgroud)
如果我Icon="myIcon.ico"在 之前添加,则会在in>上出现错误WWidth="1058.204"
抛出异常:PresentationFramework.dll 中的“System.Windows.Markup.XamlParseException”
附加信息:“为‘System.Windows.Baml2006.TypeConverterMarkupExtension’提供值引发了异常。” 行号“8”和行位置“58”。
因此,错误的代码如下所示:
<Window x:Class="MyProject.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:MyProject"
mc:Ignorable="d"
Title="My Project" Height="562.356" Width="1058.204"
Icon="myIcon.ico">
Run Code Online (Sandbox Code Playgroud)
我觉得我一定在这里错过了一些非常简单的东西。基于此处的其他帖子(How to change title bar image in WPF Window?),我觉得我做得对。
有人可以帮忙吗?谢谢!