简化wpf中的资源字典寻址
Simplify resource dictionary addressing in wpf
让我这样描述问题
我已经创建了一个自定义控件,用户可以通过这种方式使用自定义控件
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="/customControl;component/ThemeResources/Light.xaml"/>
<ResourceDictionary Source="/customControl;component/ThemeResources.xaml"/>
</ResourceDictionary.MergedDictionaries>
这个方法没有问题,所有资源都能被VS IntelliSense识别。
现在为了更容易使用自定义控件,我使用以下 class:
public class Theme : ResourceDictionary
{
public Theme()
{
if (DesignerHelper.IsInDesignMode)
{
MergedDictionaries.Add(new ResourceDictionary
{
Source = new Uri("pack://application:,,,/customControl;component/ThemeResources/Light.xaml")
});
MergedDictionaries.Add(new ResourceDictionary
{
Source = new Uri("pack://application:,,,/customControl;component/ThemeResources.xaml")
});
}
else
{
UpdateResource();
}
}
private Uri _source;
public new Uri Source
{
get => DesignerHelper.IsInDesignMode ? null : _source;
set => _source = value;
}
public string Name { get; set; }
private void UpdateResource()
{
if (DesignerHelper.IsInDesignMode) return;
MergedDictionaries.Clear();
MergedDictionaries.Add(new ResourceDictionary
{
Source = new Uri("pack://application:,,,/customControl;component/ThemeResources.xaml")
});
MergedDictionaries.Add(new ResourceDictionary
{
Source = new Uri("pack://application:,,,/customControl.Controls;component/ThemeResources/Light.xaml")
});
}
}
现在这样我们就可以使用自定义控件了:
<ResourceDictionary.MergedDictionaries>
<ui:Theme/>
</ResourceDictionary.MergedDictionaries>
现在的问题是 None 的资源没有被 IntelliSense 检测到 但是如果我们自己写样式名称,我们可以使用资源。
为什么会出现这个问题?
如何解决这个问题?
当未构建解决方案时,XAML 智能感知需要在没有 运行 任何代码的情况下工作 and/or。因此它不知道创建 Theme 会用 pack://application:,/customControl;component/Themes/Generic.xaml
.
填充它
让我这样描述问题 我已经创建了一个自定义控件,用户可以通过这种方式使用自定义控件
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="/customControl;component/ThemeResources/Light.xaml"/>
<ResourceDictionary Source="/customControl;component/ThemeResources.xaml"/>
</ResourceDictionary.MergedDictionaries>
这个方法没有问题,所有资源都能被VS IntelliSense识别。
现在为了更容易使用自定义控件,我使用以下 class:
public class Theme : ResourceDictionary
{
public Theme()
{
if (DesignerHelper.IsInDesignMode)
{
MergedDictionaries.Add(new ResourceDictionary
{
Source = new Uri("pack://application:,,,/customControl;component/ThemeResources/Light.xaml")
});
MergedDictionaries.Add(new ResourceDictionary
{
Source = new Uri("pack://application:,,,/customControl;component/ThemeResources.xaml")
});
}
else
{
UpdateResource();
}
}
private Uri _source;
public new Uri Source
{
get => DesignerHelper.IsInDesignMode ? null : _source;
set => _source = value;
}
public string Name { get; set; }
private void UpdateResource()
{
if (DesignerHelper.IsInDesignMode) return;
MergedDictionaries.Clear();
MergedDictionaries.Add(new ResourceDictionary
{
Source = new Uri("pack://application:,,,/customControl;component/ThemeResources.xaml")
});
MergedDictionaries.Add(new ResourceDictionary
{
Source = new Uri("pack://application:,,,/customControl.Controls;component/ThemeResources/Light.xaml")
});
}
}
现在这样我们就可以使用自定义控件了:
<ResourceDictionary.MergedDictionaries>
<ui:Theme/>
</ResourceDictionary.MergedDictionaries>
现在的问题是 None 的资源没有被 IntelliSense 检测到 但是如果我们自己写样式名称,我们可以使用资源。
为什么会出现这个问题? 如何解决这个问题?
XAML 智能感知需要在没有 运行 任何代码的情况下工作 and/or。因此它不知道创建 Theme 会用 pack://application:,/customControl;component/Themes/Generic.xaml
.