WPF 自定义泛型用户控件后跨程序集继承用户控件的解决方案
自定义泛型用户控件:
<UserControl x:Class="ClassLibrary1.UcEumCmb"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:ClassLibrary1"
mc:Ignorable="d"
d:DesignHeight="450" d:DesignWidth="800">
<Grid DataContext="{Binding ElementName=parent}">
<ComboBox Name="cmb2" SelectedItem="{Binding SelectedEnumValue}" />
</Grid>
</UserControl>
public abstract partial class UcEumCmb : UserControl
{ } /// <summary>
/// UcEumCmb.xaml 的交互逻辑
/// </summary>
public class UcEumCmb<T> : UcEumCmb where T : struct
{
public UcEumCmb()
{
InitializeComponent();
// this.LoadViewFromUri("/ClassLibrary1;component/UcEumCmb.xaml");
foreach (Enum enumValue in Enum.GetValues(typeof(T)))
{
cmb2.Items.Add(enumValue);
}
}
public T SelectedEnumValue
{
get { return (T)GetValue(SelectedEnumValueProperty); }
set { SetValue(SelectedEnumValueProperty, value); }
} public static readonly DependencyProperty SelectedEnumValueProperty =
DependencyProperty.Register("SelectedEnumValue", typeof(T), typeof(UcEumCmb<T>), new FrameworkPropertyMetadata { BindsTwoWayByDefault = true });
}
然后声明一个用户控件类,继承即可
public class DayOfWeekSelectorExt2 : UcEumCmb<DayOfWeek> { }
以上参考了:
https://stackoverflow.com/questions/3811179/wpf-usercontrol-with-generic-code-behind
但是,当我们需要自定义泛型T用户控件的时候,大部分情况就是为了分离泛型T类库和用户控件类库之间的依赖,所以一般
DayOfWeekSelectorExt2 : UcEumCmb<DayOfWeek>
会放在主程序里去做
但是这会导致vs编辑器报错提示
不具有由 URI“/ClassLibrary1;component/uceumcmb.xaml”识别的资源。
直接运行也会报错
根据相关资料
1 https://blog.csdn.net/lishuangquan1987/article/details/123347719 (Wpf BUG:组件“XXX”不具有由 URI“XXX“识别的资源)
2 https://www.cnblogs.com/lindexi/p/16714348.html (dotnet 读 WPF 源代码笔记 为什么自定义的 UserControl 用户控件不能跨程序集继承)
3 https://stackoverflow.com/questions/7646331/the-component-does-not-have-a-resource-identified-by-the-uri
需要手动去load usercontrol对应的xaml解决方案如下:
public static class Extensions
{
public static void LoadViewFromUri(this FrameworkElement userControl, string baseUri)
{
try
{
var resourceLocater = new Uri(baseUri, UriKind.Relative);
var exprCa = (PackagePart)typeof(Application).GetMethod("GetResourceOrContentPart", BindingFlags.NonPublic | BindingFlags.Static).Invoke(null, new object[] { resourceLocater });
var stream = exprCa.GetStream();
var uri = new Uri((Uri)typeof(BaseUriHelper).GetProperty("PackAppBaseUri", BindingFlags.Static | BindingFlags.NonPublic).GetValue(null, null), resourceLocater);
var parserContext = new ParserContext
{
BaseUri = uri
};
typeof(XamlReader).GetMethod("LoadBaml", BindingFlags.NonPublic | BindingFlags.Static).Invoke(null, new object[] { stream, parserContext, userControl, true });
}
catch (Exception)
{
//log
}
}
}
public UcEumCmb()
{
//InitializeComponent();
this.LoadViewFromUri("/ClassLibrary1;component/UcEumCmb.xaml");
foreach (Enum enumValue in Enum.GetValues(typeof(T)))
{
cmb2.Items.Add(enumValue);
}
}
取消 InitializeComponent,改为手动load
项目编译运行均正常,
<StackPanel Grid.Row="1" VerticalAlignment="Center" HorizontalAlignment="Center" >
<TextBlock Text="{Binding DayOfWeek,StringFormat=You have selected {0}!}" />
<uc:DayOfWeekSelectorExt2 SelectedEnumValue="{Binding DayOfWeek}" Margin="0,5,0,0" />
<local:DayOfWeekSelectorExt3 SelectedEnumValue="{Binding DayOfWeek}" Margin="0,5,0,0" />
</StackPanel> using ClassLibrary1; namespace EnumSelector
{
public class SomeViewModel // TODO implement INotifyPropertyChanged to support all binding scenarios
{
public DayOfWeek DayOfWeek { get; set; }
} public class DayOfWeekSelector : EnumComboBox<DayOfWeek> { }
public class DayOfWeekSelectorExt : UserControl1<DayOfWeek> { }
public class DayOfWeekSelectorExt3 : ClassLibrary1.UcEumCmb<DayOfWeek> {
WPF 自定义泛型用户控件后跨程序集继承用户控件的解决方案的更多相关文章
- oracle在不知道用户密码的时候,怎么样跳转到另外一个用户执行操作后并不影响该用户?
我们通过如下的方法,可以安全使用该用户,然后再跳转回来,在某些时候比较有用 需要Alter user权限或DBA权限: SQL> select password from dba_users w ...
- 在Winform界面使用自定义用户控件及TabelPanel和StackPanel布局控件
在很多时候,我们做一些非常规化的界面的时候,往往需要创建一些用户控件,在其中绘制好一些基础的界面块,作为后续重复使用的一个单元,用户控件同时也可以封装处理一些简单的逻辑.在开发Winform各种类型项 ...
- WPF中窗口控件的跨线程调用
在WinForm中,我们要跨线程访问窗口控件,只需要设置属性CheckForIllegalCrossThreadCalls = false;即可. 在WPF中要麻烦一下,同样的不允许跨线程访问,因为没 ...
- WPF 自定义ComboBox样式,自定义多选控件
原文:WPF 自定义ComboBox样式,自定义多选控件 一.ComboBox基本样式 ComboBox有两种状态,可编辑和不可编辑状态.通过设置IsEditable属性可以切换控件状态. 先看基本样 ...
- WPF自定义分页控件,样式自定义,简单易用
WPF自定义分页控件 做了许久伸手党,终于有机会贡献一波,搜索一下WPF分页控件,还是多,但是不太通用,主要就是样式问题,这个WPF很好解决,还有一个就是分页控件嘛,只关心几个数字的变动就行了,把页码 ...
- WPF自定义选择年月控件详解
本文实例为大家分享了WPF自定义选择年月控件的具体代码,供大家参考,具体内容如下 封装了一个选择年月的控件,XAML代码: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ...
- 继续聊WPF——自定义CheckBox控件外观
上一篇文章中谈到了BulletDecorator控件,就是为自定义CheckBox控件的模板做准备,因为CheckBox需要比较严格的布局,正好,BulletDecorator控件就合适了,该控件的布 ...
- WPF自定义LED风格数字显示控件
原文:WPF自定义LED风格数字显示控件 版权声明:本文为博主原创文章,转载请注明作者和出处 https://blog.csdn.net/ZZZWWWPPP11199988899/article/de ...
- 【C#】wpf自定义calendar日期选择控件的样式
原文:[C#]wpf自定义calendar日期选择控件的样式 首先上图看下样式 原理 总览 ItemsControl内容的生成 实现 界面的实现 后台ViewModel的实现 首先上图,看下样式 原理 ...
- WPF 自定义UI控件学习
最近项目中运用到了WPF处理三维软件,在C/S结构中WPF做UI还是有很多优越性,简单的学了一点WPF知识,成功的完成项目目标.项目过度阶段对于WPF的一些基本特点有了进一步了解 .至此花费一点时间研 ...
随机推荐
- [ML] 科学编程语言 Octave 简单操作
octave 是和 matlab 类似的软件,可以方便的进行矩阵计算.图形绘图. matlab 收费,octave 是 gnu 开源软件. Mac 安装: $ brew install octave ...
- dotnet C# 根据椭圆长度和宽度和旋转角计算出椭圆中心点的方法
本文来告诉大家如何根据椭圆长度和宽度和旋转角计算出椭圆中心点的方法 方法很简单,请看代码 /// <summary> /// 辅助进行椭圆点计算的类 /// </summary> ...
- html+jq实现全国省的单选,弹框输入input
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <meta name ...
- ITIL是标准吗?
ITIL不是标准 OGC:是一个推荐的管理框架,一个模版,可根据运维实践自由裁量落地 itil诞生环境:欧美思维.欧美文化.欧美制度.欧美人文习惯.... 对欧美来说可能是最佳实践,但是对中国特色文化 ...
- 2022年官网下安装ZooKeeper最全版与官网查阅方法
目录 一.环境整合 构建工具(参考工具部署方式) 二.官网下载 三.解压安装 四.配置环境 五.启动运行 六.配置为服务 七.查看设置服务 其他版本安装 构建工具(参考工具部署方式) 一.环境整合 构 ...
- 4G EPS 的架构模型
目录 文章目录 目录 前文列表 EPS 的架构 EPS 的架构模型 E-UTRAN UE eNodeB EPC MME(移动性管理) SGW(本地移动性锚点) PGW(业务锚点) HSS(用户认证及鉴 ...
- OpenNESS & OpenVINO Demo 部署
目录 文章目录 目录 部署架构 部署 Edge Controller 基础配置 配置 Proxy 配置防火墙 Install necessary package Install MySQL Insta ...
- JS监听DOM创建和销毁
源码 web开发指南 <!DOCTYPE html> <html lang="zh"> <head> <meta charset=&quo ...
- nohup Command [ Arg … ] [ & ]
nohup 英文全称:no hang up 不挂断的意思.退出终端不挂断程序的运行.在默认的情况下,会输出一个名叫 nohup.out 的文件到当前目录下.nohup Command [ Arg - ...
- 【C#】初次使用webapi的体会
webapi controller 要继承 ApiController 重写权限验证 ,记得使用 System.Web.Http下的AuthorizeAttribute. webapi默认路由 ...