好的,我已经弄清楚如何使用LayoutTransform和ScaleTransform让我的UI元素网格进行缩放.我不明白的是我如何让我的View响应CTRL + MouseWheelUp\Down来做到这一点,以及如何使代码适应MVVM模式.
我的第一个想法是将ZoomFactor存储为属性,并绑定到命令来调整它.
我看的是:
<UserControl.InputBindings>
<MouseBinding Command="{Binding ZoomGrid}" Gesture="Control+WheelClick"/>
</UserControl.InputBindings>
Run Code Online (Sandbox Code Playgroud)
但我看到2个问题:
1)我认为没有办法判断车轮是上升还是下降,我也不知道如何确定车轮的数量.我见过MouseWheelEventArgs.Delta,但不知道怎么弄它.
2)绑定到viewmodel上的命令似乎不对,因为它严格来说是View事物.
由于缩放只是严格的UI视图,我认为实际的代码应该放在代码隐藏中.
你们怎么实现这个?
ps,我使用Cinch for MVVM使用.net\wpf 4.0.
我有一个MyGrid.Children UIElementCollection,我想在其中找到所有样式设置为StyleA的矩形,并将它们设置为StyleB.
如果可能的话我想使用LINQ,所以我可以避免讨厌的嵌套循环.
像这样的伪代码:
var Recs = from r in MyGrid.Children
where r.Style == StyleA && r.GetType() == typeof(Rectangle)
select r as Rectangle;
Run Code Online (Sandbox Code Playgroud)
然后:
foreach(Rectangle r in Recs)
r.Style = StyleB;
Run Code Online (Sandbox Code Playgroud)
LINQ大师可以帮助我改进我的LINQ-fu吗?
我一直试图想这几天,没有运气.
我正在尝试使用[ImportMany]从一个充满DLL的目录导入IEditorSystem类型的导出,它具有IEditorSystemMetadata类型的自定义元目.我想首先获取元数据,并将其推送到一些文本框等,以便用户可以选择使用哪个EditorSystem,并在选择时加载该系统......
我一直在尽可能地遵循示例,这是我到目前为止所拥有的.
[ImportMany]
public ObservableCollection<Lazy<IEditorSystem, IEditorSystemMetadata>> EditorSystemList
Run Code Online (Sandbox Code Playgroud)
这是它应该导入的内容:
[Export(typeof(IEditorSystem))]
[SignalSystemData("Very Very Long Name", "Short Name")]
public class MyEditorSystem: IEditorSystem
{
public MyEditorSystem()
{
}
}
Run Code Online (Sandbox Code Playgroud)
和创业公司:
AggregateCatalog Catalog = new AggregateCatalog(
new DirectoryCatalog(@".\EditorSystems"),
new AssemblyCatalog(Assembly.GetExecutingAssembly()));
CompositionContainer Container = new CompositionContainer(Catalog);
Container.ComposeParts(this);
Run Code Online (Sandbox Code Playgroud)
我可以在Catalog.Part中看到MyEditorSystem和具有ImportMany的viewmodel,但是从未填充EditorSystemList.我没有写作错误.
我认为这可能与Lazy <>有关,所以我试过了
public ObservableCollection<IEditorSystem> EditorSystemList
Run Code Online (Sandbox Code Playgroud)
也没有运气.
我能想到的唯一复杂因素是我正在使用Cinch,它使用MEFedMVVM,它也使用MEF.我认为它不会干扰,但我不确定.
我想我做错了,有人能理解这个吗?
更新:
实现一个新的IComposer,其中包含您需要的目录.
虽然ImportMany仍然失败,但只有在我尝试使用它导入元数据时才会失败.元数据只是几个字符串,据我所知,遵循示例.
最后找到原因:IEditorSystem的实现是在一个单独的DLL中,如前所述.但是,dll的任何新版本都不会复制到主项目的输出子目录中.我手动复制了第一个,忘了将后期构建副本添加到dll项目中.哦,好好学习了一堆关于MEF的东西,所以不是完全浪费了几天:)
我有一个抽象基类和一个派生类.我正在尝试使用MEF通过在基类中使用[ImportingConstructor]向我的WindowManager注入引用.即.
[ImportingConstructor]
public SomeViewModel(IWindowManager windowmanager) {...}
Run Code Online (Sandbox Code Playgroud)
问题是,在我添加之前,我所有的都没有param构造函数,并且派生类抱怨如果我向基类添加一个无参数构造函数,WindowManager永远不会被注入.
使用我目前有限的知识,我能想到的唯一方法是将管理器导入更改为属性导入,并且只有一个无参数的默认构造函数.这种错误,因为一般规则似乎更喜欢构造函数注入所需的依赖项,以及属性注入可选的.
我可以在我的子类中添加覆盖[ImportingConstructor],但这似乎是不必要的代码重复.
有没有更好的方法来做到这一点,即确保在创建派生类时注入我的依赖项?
我有一个用于编辑的窗口.编辑器应该加载一个dll(我完全控制它)以响应用户的选择,以了解如何直观地显示信息.(它们是dll,因为用户不一定想要或不需要每一个显示模型,并且还允许添加新的模型而不会弄乱主项目)
它们都将简单地存储在一个子目录中(现在无论如何)我很确定我可以枚举可用的dll但是我还需要做两件我不确定的事情.
1)从dll获取元数据的一些方法,所以我可以构建可能的显示选择列表......
2)加载选定的dll,并根据需要卸载它
任何建议将不胜感激.