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
相关产品推荐
相关产品推荐

