我有一个自定义的WinForms控件(继承自控件,即没有用户界面jsut作为Timer),我想添加一个自定义命令添加设计时间.
这可能类似于"右键单击并选择菜单中的'编辑项目...'".
这是可能的吗?怎么样?
另外,您能否推荐一些有关改善自定义控件设计时间体验的一般性阅读(在线)?
我有类似于向导控件的东西,中间是我想用来放置任何子控件的Panel.
我发现使用ScrollableControlDesigner将允许将删除的控件添加到custom/usercontrol,但这不是我需要的.它需要添加到容器中,因此可以应用布局而不会影响"外部"控件(标题,导航按钮).
我尝试了各种各样的方法,但没有用,看起来很笨拙.
有任何想法吗?
我想向组件添加一个表示控件集合的属性,并具有一个集合编辑器,通过它我可以轻松地选择属于该集合的控件。VS确实几乎什么,我用下面的代码自动希望:
Private _controls As New List(Of Control)
<DesignerSerializationVisibility(DesignerSerializationVisibility.Content)> _
Public ReadOnly Property SelectedControls() As List(Of Control)
Get
Return _controls
End Get
End Property
Run Code Online (Sandbox Code Playgroud)
我得到默认的CollectionEditor,可以添加和删除控件,并且集合被序列化。
问题是我不想添加新控件,我想从表单上的其他可用控件中选择多个控件。有什么简单/标准的方法可以做到这一点,还是我必须编写自己的集合编辑器并运行控件集合?
尽管关于集合编辑器(UITypeEditors)和其他设计时主题的材料很多,但我找不到能够证明这种确切行为的任何链接,因此可以提供任何帮助。
.net user-controls design-time uitypeeditor collectioneditor
我目前正在开发一个项目,我的部分是设计一个Design Surface,最终用户可以在运行时添加/删除/移动控件.
我按照本教程"由Tim Dawson主持Windows窗体设计器",几乎已经实现了我需要的所有功能.
短篇小说对于那些谁不想读教程:我实现了IDesignerHost,IContainer,ISelectionService,IToolboxService和其他一些界面,创建我的设计图面.我没有使用System.ComponentModel.Design.DesignSurface已经在框架中,主要是因为我需要一个真正的自定义设计表面.
我想允许用户拖放新Control从IToolboxService到IDesignerHost/IContainer.在本教程中,您可以Control在工具箱中单击,在设计图面上单击以添加控件.
IToolboxService,
System.ComponentModel.Design.DesignSurface但如果你从零开始实现IDesignerHost,它显然无法正常工作.使用该
Control.DoDragDrop(ToolboxItem)
方法时,要启动拖放操作:
IToolboxService.SerializeToolboxItem(ToolboxItem)
被调用来序列化项目 IToolboxService.IsToolboxItem(object)
并IToolboxService.IsSupported(object)
调用以评估是否IToolboxService.DeserializeToolboxItem(object serializedObject)由设计表面调用以反序列化控件.IToolboxService.SetCursor() 被调用以了解您是否定义了自定义光标,或者让标准窗口光标.
我实现了上面提到的所有内容,在"我发现了什么"中,但拖放是错误的:
DragDropEffects.Copy"样式之间略微闪烁.Control创建新的并添加到我丢弃它的地方.有没有人试图做我正在做的事情,如果有的话,你是如何管理它的?有没有人有任何指针/链接/好建议?
谢谢=)
我使用一个组件(System.ComponentModel.Component),我想获取我的项目的应用程序路径,以便在其中创建一个文件.
谢谢
弗洛里安
这可能有点像,但假设我想在ViewModel中使用Moq来创建一些设计时数据,如下所示:
public class SomeViewModel
{
public SomeViewModel(ISomeDependency dependency)
{
if (IsInDesignMode)
{
var mock = new Mock<ISomeDependency>();
dependency = mock.Object; // this throws!
}
}
}
Run Code Online (Sandbox Code Playgroud)
模拟可以设置为做一些事情,但你明白了.
我的问题是,在Blend的设计时,这段代码抛出一个InvalidCastException,消息沿着"无法将类型为'Castle.Proxies.ISomeDependencyProxy2b3a8f3188284ff0b1129bdf3d50d3fc'的对象强制转换为'ISomeDependency'." 虽然这不一定看起来与Moq相关但与Castle相关,我希望Moq示例有帮助;)
知道为什么会这样吗?
谢谢!
作为一些背景知识,我正在使用Windows Store应用程序和Windows Phone 8应用程序共享一个ViewModel(PCL).
我正在使用MVVMLight和NInject/Common Service Locator来实例化视图模型和服务.这是伟大的,给我非常好的松耦合,这是很棒的测试等等.
然而,获得设计时数据支持(通过切换不同的NInject模块等)是一个完整的黑盒子,虽然我现在有它工作我对它不是很满意,它主要是通过反复试验.
我正在使用标准做法ViewModelLocator(实例化为app资源)从服务定位器中提取View Models.这总是被执行.
问题是,我无法确定设计时编辑器实际执行了多少代码.因此,为了确保初始化NInject并将CSL挂钩到NInject,我必须在其ViewModelLocator上调用一个静态构造函数App来启动NInject.
这对我来说似乎不对.实际上,我想知道最佳做法是什么,以及是否有任何文档/保证应用程序的哪些部分在设计时显示"启动",如果它们之间存在差异Windows应用商店应用和Windows Phone 8应用.
ViewModelLocator.cs(片段)
public class ViewModelLocator
{
static ViewModelLocator()
{
System.Diagnostics.Debug.WriteLine("VML Start");
var servicelocator = new NinjectServiceLocator(App.Kernel);
ServiceLocator.SetLocatorProvider(() => servicelocator);
System.Diagnostics.Debug.WriteLine("VML End");
}
public AppViewModel AppViewModel
{
get { return ServiceLocator.Current.GetInstance<AppViewModel>(); }
}
public MainViewModel MainViewModel
{
get { return ServiceLocator.Current.GetInstance<MainViewModel>(); }
}
}
Run Code Online (Sandbox Code Playgroud)
App.xaml.cs(片段)
partial class App : Application
{
public static StandardKernel Kernel { private set; get; }
static App() …Run Code Online (Sandbox Code Playgroud) xaml design-time dependency-injection windows-phone windows-store-apps
对于WPF/Silverlight/XAML4Win8/WP8/whathaveyou,视觉效果是由(我相信)创建自定义视图(window/page/usercontrol/whathaveyou)派生自的基类实例,然后应用XAML创建的.事后.
如果我没有弄错,这意味着类型构造函数中的代码隐藏将丢失.有没有办法在视图本身中执行设计时对象创建逻辑?更重要的是,在网上有一个很好的总结,了解Cider/Blend设计师如何在设计时实际创建所见即所得的视图?我好像在某处回忆起一些关于这个的文档(也许是Expression Studio的文档?)但是我找不到它们的生命.
我目前正在运行Visual Studio 2015的"14.0.23103.0 D14REL",并注意到关于实现ICommandSource接口的自定义UI控件的一个奇怪的设计时异常.更有趣的是,如果目标平台是x64,问题就出现了.当设置来自上述接口的实现的自定义控件的Command属性时,VS设计器抛出" 属性"命令"没有可访问的setter "异常.
当平台是x64或者我错过了某些东西时,这是Visual Studio 2015的已知问题吗?这是我实现的一些代码.
风景
<Grid>
<local:MyControl MySecondCommand="{Binding MyCommand}"
Command="{Binding MyCommand}"/>
</Grid>
Run Code Online (Sandbox Code Playgroud)自定义控件
public class MyControl : Control, ICommandSource
{
public static readonly DependencyProperty MySecondCommandProperty =
DependencyProperty.Register("MySecondCommand", typeof(ICommand), typeof(MyControl), new PropertyMetadata(null));
public ICommand MySecondCommand
{
get { return (ICommand)this.GetValue(MySecondCommandProperty); }
set { this.SetValue(MySecondCommandProperty, value); }
}
public static readonly DependencyProperty CommandProperty =
DependencyProperty.Register("Command", typeof(ICommand), typeof(MyControl), new PropertyMetadata(null));
public ICommand Command
{
get { return (ICommand)this.GetValue(CommandProperty); }
set …Run Code Online (Sandbox Code Playgroud)在 WPF 中,我使用了以下的正常组合:
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
d:DataContext="{d:DesignData...}"
Run Code Online (Sandbox Code Playgroud)
允许设置设计时 DataContext。这意味着我在 XAML 中获得了合理的 Intellisense。我意识到上面的代码无法编译,但你明白了。
我刚刚开始使用 MAUI(没有 Blazor),并且希望实现同样的目标 - 这样我就可以告诉 Visual Studio 我的 ContentView 将绑定到特定的对象类型,即 d:BindingContext="" 以这样的方式运行时会被忽略吗?这将使设计 ItemTemplates 变得更加容易!
design-time ×10
c# ×5
xaml ×4
.net ×2
winforms ×2
wpf ×2
64-bit ×1
components ×1
data-binding ×1
maui ×1
mvvm ×1
path ×1
silverlight ×1
uitypeeditor ×1