在设计时使用抽象基类渲染用户控件

发布于 2024-10-16 04:36:28 字数 327 浏览 0 评论 0原文

我正在开发一个项目,该项目具有多个继承自抽象基类(本身基于 UserControl)的 WPF 用户控件。这些控件在运行时渲染得很好,但它们不会在设计器中渲染。

我认为发生这种情况是因为设计器尝试创建 xaml 根元素的实例(在本例中是我的基类),但它无法创建实例,因为它是抽象的。

根据记录,我知道在 WPF 中使用这种类型的控制层次结构存在“模式和实践”类型的问题,但目前无法重构整个项目。

我的问题是这样的:我知道有用于设置 DataContext、DesignWidth 等的设计时属性。我想知道的是,您能否提供一个“设计时”实例或类型作为控件在运行时提供的替代品加载到设计器中了吗?

I'm working on a project that has several WPF User Controls that inherit from an abstract base class (itself based on UserControl). These controls render just fine at runtime, but they don't render in the designer.

I gather that this happens because the designer attempts to create an instance of the xaml root element, in this case my base class, but it can't create an instance because it is abstract.

For the record, I know that there are "patterns & practices" type issues with having this type of control hierarchy in WPF, but refactoring the entire project is not an option currently.

My question is this: I know that there are design time attributes for setting the DataContext, DesignWidth, etc. What I'm wondering is, can you give a "design time" instance or type to be provided as a replacement when the control is loaded in the designer?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

镜花水月 2024-10-23 04:36:29

在设计时 Visual Studio 将尝试创建新的 YourUserControl 实例
使用无参数构造函数

如果您无法像这样立即创建用户控件,则

var myView = new MyUserControl(); //no params

设计器将无法呈现。

如果 YourUserControl 需要任何参数。最流行的技巧是在 MVVM 模式中创建像这样的专用构造函数,

public MyUserControl() : 
   this(new MockViewModel(), new MockDataContext){ } // mock Designtime constructor

puclic MyUserControl(IViewModel vm, IDataContext context) //runtime constructor
{ 
}

一些 UserControl.DataContext 是需要一些参数的用户定义类型
XAML

<UserControl.DataContext>
    <local:MyViewModel />
</UserControl.DataContext>

必须为设计时环境定义无参数构造函数。

    public MyViewModel() : this(new MockEventAggregator()) //for designtime
    { }

    [ImportingConstructor]
    public MyViewModel(IEventAggregator eventAggregator) //for runtime
    {
        this._eventAggregator = eventAggregator;
        //...
    }

in design time Visual Studio will try to create new Instant of YourUserControl
with parameterless constructor.

if you can't create usercontrol instant like this

var myView = new MyUserControl(); //no params

the designer will fail to render.

if YourUserControl required any parameter. the most popular trick is to create dedicate constructor like this

public MyUserControl() : 
   this(new MockViewModel(), new MockDataContext){ } // mock Designtime constructor

puclic MyUserControl(IViewModel vm, IDataContext context) //runtime constructor
{ 
}

in MVVM pattern some UserControl.DataContext is user-defined Type that required some params
XAML

<UserControl.DataContext>
    <local:MyViewModel />
</UserControl.DataContext>

You must define parameterless constructor for design-time environment.

    public MyViewModel() : this(new MockEventAggregator()) //for designtime
    { }

    [ImportingConstructor]
    public MyViewModel(IEventAggregator eventAggregator) //for runtime
    {
        this._eventAggregator = eventAggregator;
        //...
    }
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文