Tag: wpf

如何提取默认控制模板在Visual Studio中?

我想知道如何使用Visual Studio提取(获取副本)给定控件的默认模板。 我知道这可以用Expression Blend来完成(右键点击一个控件,“Edit Template” – >“Edit a Copy …”),然后在Xaml中复制默认控件模板。 但是,这完全可以用Visual Studio来完成吗?

该组件没有uri标识的资源

我想创build一个通用DataGrid在我所有的视图/用户控件上使用。 这是我的结构: 名为"Core" Class Library : 称为"ViewBase" : public class ViewBase : UserControl { public ViewBase() { } //Rest of Methods and Properties } 称为"Controls" Class Library : UserControl被称为"GridView" : XAML: <vb:ViewBase x:Class="Controls.GridView" 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:vb="clr-namespace:Core;assembly=Core"> <Grid> <DataGrid></DataGrid> </Grid> </vb:ViewBase> 代码背后: using Core; public partial class GridView : ViewBase { public GridView () { […]

自定义TreeView以允许多选

内置的WPF TreeView控件不允许多选,就像ListBox一样。 我如何定制TreeView以允许多重select而不重写它。

我怎样才能从资源获取BitmapImage?

我的程序集包含BuildAction == Resource的图像。 我想从这个embedded式资源获取一个BitmapImage。 我可以像这样从文件加载一个BitmapImage: var bitmap = new BitmapImage(new Uri(path)); 但是,如何创build一个将引用embedded式资源图像的Uri? 当我尝试创build“ pack URI ”(例如pack://application:,,,/MyImage.png或pack://application:,,,/MyAssembly;component/MyImage.png )时,会引发exception: System.UriFormatException“无效的URI:因为存在冒号(':')而期望端口,但是端口不能被分析。 我发现修复,在这篇博客文章的UriFormatException 但是,应用该修复程序,我仍然收到exception,尝试从pack URI中加载BitmapImage。 当使用pack://application:,,,/Image.png格式时,我得到一个NullReferenceException,并且在使用pack://application:,,,/AssemblyName;component/Image.png格式时,我得到一个NotSupportedException “Uri前缀不被识别”。 总结我的问题是,我正在尝试在任何WPF控件/窗口/ etc被实例化之前在一个进程中使用“pack URI”,所以“pack”URIscheme还没有注册(其他WPF所需的东西也必须不要太设置,因为手动注册包scheme本身并不能解决问题)。 解决scheme是等到实例化我的WPF usercontrol使用包URI。

如何自动缩放一组控件的字体大小?

我有一个WPF中的几个TextBlocks在一个网格,我想缩放取决于其可用的宽度/高度。 当我search自动缩放字体大小时,典型的build议是将TextBlock放入ViewBox。 所以我这样做了: <Grid> <Grid.ColumnDefinitions> <ColumnDefinition Width="*" /> <ColumnDefinition Width="*" /> <ColumnDefinition Width="*" /> </Grid.ColumnDefinitions> <Viewbox MaxHeight="18" Grid.Column="0" Stretch="Uniform" Margin="5" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"> <TextBlock Text="{Binding Text1}" /> </Viewbox> <Viewbox MaxHeight="18" Grid.Column="1" Stretch="Uniform" Margin="5" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"> <TextBlock Text="{Binding Text2}" /> </Viewbox> <Viewbox MaxHeight="18" Grid.Column="2" Stretch="Uniform" Margin="5" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"> <TextBlock Text="{Binding Text3}" /> </Viewbox> </Grid> 它会自动缩放每个TextBlock的字体。 然而,这看起来很有趣,因为如果其中一个TextBlocks有更长的文本,那么它将是一个较小的字体,而相邻的网格元素将是一个更大的字体。 我希望字体大小按组缩放,如果我可以指定一个“SharedSizeGroup”作为一组控件来自动调整字体大小,那么可能会很好。 […]

WPF没有XAML

在架构上,我认为WPF是相当惊人的。 一般来说,我是底层渲染/animation内部工作的忠实粉丝。 模板和样式的灵活性设置是相当令人印象深刻的。 但我讨厌XAML–我觉得这使许多事情变得复杂。 我已经用它在大型和小型应用程序,我发现自己多次试图找出如何在XAML中做的一些基本原则是基本的,但语法是古怪的。 不仅如此,我还多次想知道parsing/绑定的某些部分有多沉重。 (我知道它是编译的,但是我不确定在运行时仍然有多less评估) XAML只是构build和加载可视化树的一种方式。 是否有任何框架可以简化以非XML,基于代码的方式构build可视化树? 具体而言,我对框架感兴趣,可以在保留MVVM方法的同时缓解以下任何问题: 强有力的绑定。 指定ViewModel必须符合特定的types。 我假设BaseBinding在底层使用了reflection,我对这个速度有些怀疑,更不用说破坏性的绑定令人讨厌了。 更快的绑定,非INotifyPropertyChanged绑定。 看起来像某种BindableProperty<T>可以被创build,绑定可以直接监听,而不是接收所有的ViewModel属性更改。 直接callback与string参数的使用似乎也是有利的。 一种不同的资源pipe理方法; 再次,强types的某种字典可能是相当不错的。 我几乎喜欢将样式看作lambda或什么来捕获强types的方面。 总而言之,任何非基于XAML的框架都适合MVVM,而且是强types的?

为什么我不能在ComboBox中select一个空值?

在WPF中,从ComboBox中select(使用鼠标)“null”的值似乎是不可能的。 编辑为了澄清,这是.NET 3.5 SP1。 这里有一些代码来展示我的意思。 首先,C#声明: public class Foo { public Bar Bar { get; set; } } public class Bar { public string Name { get; set; } } 接下来,我的Window1 XAML: <Window x:Class="WpfApplication1.Window1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="Window1" Height="300" Width="300"> <StackPanel> <ComboBox x:Name="bars" DisplayMemberPath="Name" Height="21" SelectedItem="{Binding Bar}" /> </StackPanel> </Window> 最后,我的Window1类: public partial class Window1 : […]

确保事情在WPF的UI线程上运行

我正在构build一个WPF应用程序。 我正在做一些与服务器端的asynchronous通信,我在客户端使用Prism的事件聚合。 这两件事情都会导致产生新的线程,而不是UI线程。 如果我试图在这些callback和事件处理程序线程上执行“WPF操作”,那么世界将会崩溃,现在它已经开始了。 首先,我遇到了问题,尝试在服务器的callback中创build一些WPF对象。 我被告知该线程需要在STA模式下运行。 现在我试图在Prism事件处理程序中更新一些UI数据,并告诉我: 调用者不能访问此线程,因为不同的线程拥有它。 所以; 什么是在WPF中正确使用的关键? 我已经阅读了这篇MSDN文章中的WPF Dispatcher。 我开始明白了,但我还不是巫师。 当我需要运行一些我不确定的东西时,总是使用Dispatcher.Invoke的关键是在UI线程上调用吗? 如果它实际上是在UI线程上调用,那么它是否重要?我仍然使用Dispatcher.Invoke? Dispatcher.Invoke =同步。 Dispathcher.BeginInvoke =asynchronous? 请问Dispatcher.Invoke请求UI线程,然后停下来等待呢? 这是不好的做法和风险较低的应对scheme? 我怎样才能得到调度员? 请问Dispatcher.CurrentDispatcher总是给我代表UI线程的调度程序? 会不会有一个以上的Dispatcher,或者是“Dispatcher”与应用程序的UI线程基本相同? 和BackgroundWorker有什么关系? 我什么时候用这个呢? 我认为这总是asynchronous? 一切运行在UI线程(通过被调用)运行在STA公寓模式? 也就是说,如果我有需要在STA模式下运行的东西 – Dispatcher.Invoke是否足够? 任何人想为我清理的东西? 任何相关的build议,等等? 谢谢!

“你确定吗?”提示。 ViewModel的一部分还是纯粹的视图?

我一直在玩弄“你确定吗? 在我的MVVM WPF应用程序中键入提示。 我倾向于认为这些纯粹是观点的一部分。 如果ViewModel暴露了一个DeleteCommand ,那么我希望这个命令立即删除。 要将这样的提示集成到ViewModel中,必须公开一个单独的RequestDeleteCommand ,一个用于绑定提示的DeletePromptItem属性,还可以将其作为触发器来显示提示。 即使这样,也没有任何东西停止直接调用DeleteCommand的unit testing,除非在ViewModel中放置特定的逻辑来要求DeletePromptItem将作为参数提供的项目与DeleteCommand相匹配。 但是,这一切似乎像ViewModel对我来说是噪音。 提示是更多的用户界面问题,以防止错误等。对我来说,这表明它应该在视图中确认提示调用DeleteCommand。 有什么想法吗?

ReactiveUI生产准备好了吗?

我一直在研究在生产代码中使用Reactive UI的可行性。 其中一些function非常吸引人,但是我担心依赖这个库。 这些包括: 怪异的命名和惯例。 例如,以小写开头的受保护成员和RaiseAndSetIfChanged方法取决于以私人成员开头的下划线。 我理解Paul Betts(ReactiveUI作者)有一个Ruby背景,所以我想这就是奇怪的命名所在。 然而,这对我来说是一个真正的问题,因为在我的项目中标准命名(按照Stylecop)是强制执行的。 即使没有执行,我也会担心由此导致的命名不一致。 缺乏文件/样品。 有一些文件和一个孤独的样本。 但是,文档只是一系列(旧)博客post,而示例则基于图书馆的V2(现在位于V4)。 奇怪的devise,部分。 例如,日志是抽象的,以便不依赖于特定的日志框架。 很公平。 但是,因为我使用log4net(而不是NLog),我将需要我自己的适配器。 我认为这将需要我实现IRxUIFullLogger ,其中有一个方法的指标(超过50)。 我会认为一个更好的方法是定义一个非常简单的接口,然后在ReactiveUI中提供扩展方法来促进所有必要的重载。 另外,还有这个奇怪的IWantsToRegisterStuff接口是NLog程序集依赖的,我不能依赖它(因为它是一个内部接口)。 我希望我不需要那个… 无论如何,我关心的是图书馆的整体devise。 有没有人被这个咬伤? 我已经广泛使用MVVM Light。 我知道保罗做了一个博客文章,他解释说,你可以在技术上同时使用这两个,但我更关心的是可维护性。 我怀疑这两个混合在一起的代码基础是非常混乱的。 有没有人有在生产中使用Reactive UI的实践经验? 如果是这样,你能消除或解决我的任何上述问题?