如何获取自定义控件中引用 XAML 的基本 uri
我有一个自定义控件,它有一个 Image 元素,其 Source 属性向用户公开,如下所示:
<ControlTemplate>
<Image x:Name="PART_Image" Source="{Binding ImageUri, RelativeSource={RelativeSource TemplatedParent}}"/>
</ControlTemplate>
其中 ImageUri 是控件类中的一个属性,如下所示:
public Uri ImageUri { get; set; }
此自定义控件位于程序集中 customcontrol.dll,我可以毫无问题地在 .exe 中引用和使用此控件,如下所示:
<cc:MyControl ImageUri="/Resources/Image.png" />
其中 Image.png
是 .exe 项目的资源。
但是,如果我在 dll 程序集中引用并使用此控件,则会出现问题,如果我使用像这样的相对 uri,我必须使用绝对“pack://...” uri 来引用调用 dll 中的图像“Resources/Image.png”,资源无法加载,事实证明,当这个uri应用于Image元素时,它解析来自customcontrol.dll
的相对uri,而不是调用dll程序集,所以我想这样做:
public Uri ImageUri {
get { ...... }
set {
if (!value.IsAbsolute) {
// Get the assembly name of parent xaml file or code
// and construct a "pack://" uri from the assembly name
// and value.OriginalString, but how ??????
}
}
}
如何获取使用自定义控件的 XAML 代码的程序集?
如果在代码中使用控件,也许我可以在我的方法中使用GetCallingAssembly
,但是XAML内容是从PresontationCore.dll
调用的,我怎样才能找到XAML程序集? ?
I have an custom control, which has an Image element with its Source property exposed to user, like this:
<ControlTemplate>
<Image x:Name="PART_Image" Source="{Binding ImageUri, RelativeSource={RelativeSource TemplatedParent}}"/>
</ControlTemplate>
where ImageUri is an property in the control class, like this:
public Uri ImageUri { get; set; }
This custom control is in an assembly customcontrol.dll
, I can reference and use this control in an .exe with no problem, like this:
<cc:MyControl ImageUri="/Resources/Image.png" />
where Image.png
is a resource of the .exe project.
But if I reference and use this control in an dll assembly, there is a problem, I have to use a absolute "pack://..." uri to reference an image in the calling dll, if I use an relative uri like "Resources/Image.png", the resource cant be loaded, it turns out, when this uri is applied on the Image element, it resolves the relative uri from customcontrol.dll
, not the calling dll assembly, so I want to do this:
public Uri ImageUri {
get { ...... }
set {
if (!value.IsAbsolute) {
// Get the assembly name of parent xaml file or code
// and construct a "pack://" uri from the assembly name
// and value.OriginalString, but how ??????
}
}
}
How can I get the assembly of the XAML code that uses my custom control?
If the control is used in code maybe I can use GetCallingAssembly
in my methods, but XAML stuff is called from PresontationCore.dll
, how can I find out the XAML assembly???
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
好的,我自己找到了解决方案。我应该实现 IuriContext 接口,
它只有一个属性:Uri BaseUri,这正是我想要的。
OK I have found a solution myself. I should implement IUriContext interface,
which has only one property: Uri BaseUri, this is exactly what I want.