You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MDIX DialogHost中Infralution.WPF本地化控件失效问题求助

解决MaterialDesign DialogHost内控件无法用Infralution.Resx本地化的问题

问题根源

DialogHost的DialogContent会被放到独立的Popup弹窗里,这个弹窗的可视化树和主窗口是分开的。Infralution的Resx扩展依赖当前上下文的本地化资源管理器,弹窗里没继承到主窗口的本地化配置,所以解析不了资源键,只能显示#Hello_Word这种原始键名。

可行解决办法

1. 给Resx扩展显式指定资源管理器

在DialogContent里的控件上,直接指定Resx的ResourceManager属性,绑定到你自己的Resx资源类实例:

<materialDesign:DialogHost DialogTheme="Inherit">
    <materialDesign:DialogHost.DialogContent>
        <Label Content="{Resx Hello_Word, ResourceManager={StaticResource MyAppResources}}" />
    </materialDesign:DialogHost.DialogContent>
</materialDesign:DialogHost>

先在窗口资源里定义Resx类的静态资源:

<Window.Resources>
    <local:AppResources x:Key="MyAppResources" />
</Window.Resources>

这里的AppResources是你的Resx文件自动生成的类名。

2. 让DialogContent继承主窗口的DataContext

把DialogContent的DataContext绑定到主窗口,确保它能拿到和外部控件一样的本地化上下文:

<materialDesign:DialogHost DialogTheme="Inherit">
    <materialDesign:DialogHost.DialogContent>
        <StackPanel DataContext="{Binding RelativeSource={RelativeSource AncestorType=Window}}">
            <Label Content="{Resx Hello_Word}" />
        </StackPanel>
    </materialDesign:DialogHost.DialogContent>
</materialDesign:DialogHost>

如果你的ViewModel里已经配置好本地化相关内容,直接绑定ViewModel也可以。

3. 后台代码设置DialogContent的上下文

打开Dialog的时候,手动给DialogContent设置DataContext,确保它在正确的上下文里初始化:

var dialogUC = new MyDialogUserControl();
dialogUC.DataContext = this.DataContext; // 继承主窗口的DataContext
DialogHost.Show(dialogUC);

这种方式适合动态创建弹窗内容的场景。

4. 全局配置Resx扩展的默认资源管理器

在App.xaml里全局设置Resx扩展的默认资源管理器,让弹窗里的控件也能直接用:

<Application.Resources>
    <infralution:ResxExtension x:Key="GlobalResx" ResourceManager="{x:Type local:AppResources}" />
</Application.Resources>

然后弹窗里的控件这么用:

<Label Content="{StaticResource GlobalResx, Path=Hello_Word}" />

内容的提问来源于stack exchange,提问作者Sweet MBH

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 01:40:31