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的一些基本特点有了进一步了解 .至此花费一点时间研 ...
随机推荐
- [FAQ] VScode 用户代码片段设置
以PHP为示例,配置如下: { "dpe": { "prefix": "dpe", "body": [ " ...
- UWP WinRT 使用系统自带的分词库对字符串文本进行分词
本文将和大家介绍在 UWP 应用,或其他能接入 WinRT 的应用里,使用系统自带的分词库,对中文.英文等等自然语言的字符串文本进行分词 开始之前需要说明的是,现在不仅仅 UWP 应用,其他的 UI ...
- ASP.NET Core 将文件夹内容输出为压缩包文件方法
本文主要是告诉大家一个省内存的方法,将整个文件夹的内容作为一个压缩包输出,但是实际上没有申请那么多的内存,也不需要升级创建一个压缩包文件.原理是通过逐个读文件然后按照压缩包格式输出 在每个请求的方法可 ...
- B/S 结构系统的 缓存机制(Cookie) 以及基于 cookie 机制实现 oa 十天免登录的功能
B/S 结构系统的 缓存机制(Cookie) 以及基于 cookie 机制实现 oa 十天免登录的功能 @ 目录 B/S 结构系统的 缓存机制(Cookie) 以及基于 cookie 机制实现 oa ...
- 题解:ssy的队列
题目链接 题目描述 SSY是班集体育委员,总喜欢把班级同学排成各种奇怪的队形,现在班级里有 \(N\) 个身高互不相同的同学,请你求出这 \(N\) 个人的所有排列中任意两个相邻同学的身高差均不为给定 ...
- 【简说Python WEB】Flask应用的单元测试
[简说Python WEB]Flask应用的单元测试 tests/test_basics.py import unittest from flask import current_app from a ...
- Ubuntu(Linux)虚拟机与主机共享文件夹hgfs文件普通用户不能访问问题
参考文章: https://blog.csdn.net/weixin_42224577/article/details/108107554 在虚拟机中设置好添加共享文件后,普通用户并不能访问mnt文件 ...
- 01. go-admin的下载与启动
目录 一.介绍 二.新建空文件夹 三.获取后台源码并启动 1.下载编译go代码 2.配置命令到goland IDE ,debug启动 四.获取前端ui源码并启动 1.下载编译go代码 2.启动项目 * ...
- PHP做api开发时,签名验证你是怎么设计的
开发过程中,我们经常会与接口打交道,有的时候是调取别人网站的接口,有的时候是为他人提供自己网站的接口,但是在这调取的过程中都离不开签名验证. 我们在设计签名验证的时候,请注意要满足以下几点: 可变性: ...
- Java中双括号初始化是个什么操作
最近在阅读Mybatis源码的时候,看到了一种原来很少见到的语法: public class RichType { ... private List richList = new ArrayList( ...