Tag: wpf

使用Dispatcher.Invoke从非主线程更改WPF控件

我最近开始在WPF编程,碰到以下问题。 我不明白如何使用Dispatcher.Invoke()方法。 我有线程的经验,我已经做了一些简单的Windows窗体程序,我刚刚使用 Control.CheckForIllegalCrossThreadCalls = false; 是的,我知道这是很蹩脚的,但这些都是简单的监控应用程序。 事实上,现在我正在做一个WPF应用程序,在后台检索数据,我开始一个新的线程,使调用检索数据(从networking服务器),现在我想显示在我的WPF表单。 事情是,我不能从这个线程设置任何控制。 甚至没有标签或任何东西。 这怎么解决? 回答评论: @Jalfp: 所以当我得到这些数据的时候,我在“新步伐”中使用了这个Dispatcher方法? 或者,我应该让一个后台工作人员检索数据,把它放到一个字段,并开始一个新的线程,等待这个字段填充,并呼吁调度员显示检索到的数据到控制?

绑定WPF DataGrid中ComboBoxColumn的ItemsSource

我有两个简单的模型类和ViewModel … public class GridItem { public string Name { get; set; } public int CompanyID { get; set; } } public class CompanyItem { public int ID { get; set; } public string Name { get; set; } } public class ViewModel { public ViewModel() { GridItems = new ObservableCollection<GridItem>() { new GridItem() { […]

如何定义TextBoxinput限制?

如何限制TextBox只接受大写字母或数字,或禁止放置任何特殊字符? 当然,抓住TextInput事件并处理这里的文本是一块蛋糕,但这是否是正确的方法呢?

元素名称从ContextMenu中的MenuItem绑定

有没有人注意到ElementName绑定不能正确parsingContextMenu对象中包含的MenuItem对象? 看看这个例子: <Window x:Class="EmptyWPF.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" x:Name="window"> <Grid x:Name="grid" Background="Wheat"> <Grid.ContextMenu> <ContextMenu x:Name="menu"> <MenuItem x:Name="menuItem" Header="Window" Tag="{Binding ElementName=window}" Click="MenuItem_Click"/> <MenuItem Header="Grid" Tag="{Binding ElementName=grid}" Click="MenuItem_Click"/> <MenuItem Header="Menu" Tag="{Binding ElementName=menu}" Click="MenuItem_Click"/> <MenuItem Header="Menu Item" Tag="{Binding ElementName=menuItem}" Click="MenuItem_Click"/> </ContextMenu> </Grid.ContextMenu> <Button Content="Menu" HorizontalAlignment="Center" VerticalAlignment="Center" Click="MenuItem_Click" Tag="{Binding ElementName=menu}"/> <Menu HorizontalAlignment="Center" VerticalAlignment="Bottom"> <MenuItem x:Name="anotherMenuItem" Header="Window" Tag="{Binding ElementName=window}" […]

调用线程必须是STA,因为许多UI组件都需要这个

我正在使用http://www.codeproject.com/KB/IP/Facebook_API.aspx 我正在尝试调用使用WPF创build的XAML 。 但它给了我一个错误: 调用线程必须是STA,因为许多UI组件都需要这个。 我不知道该怎么办。 我正在尝试这样做: FacebookApplication.FacebookFriendsList ffl = new FacebookFriendsList(); 但它给了我这个错误。 我添加了一个后台工作者: static BackgroundWorker bw = new BackgroundWorker(); static void Main(string[] args) { bw.DoWork += bw_DoWork; bw.RunWorkerAsync("Message to worker"); Console.ReadLine(); } static void bw_DoWork(object sender, DoWorkEventArgs e) { // This is called on the worker thread FacebookApplication.FacebookFriendsList ffl = new FacebookFriendsList(); Console.WriteLine(e.Argument); // […]

WPF ICommand MVVM实现

所以在这个特定的MVVM实现中,我需要几个命令。 我真的厌倦了一个一个的实现ICommand类,所以我提出了一个解决scheme,但我不知道它有多好,所以在这里任何WPF专家的input将不胜感激。 如果你能提供更好的解决scheme,甚至更好! 我所做的是一个ICommand类和两个代表,它们将一个对象作为参数,一个代表是void(用于OnExecute),另一个代表是OnCanExecute。 所以在我的ICommand(由ViewModel类调用)的构造函数中,我发送了两个方法,并在每个ICommand方法上调用委托的方法。 它工作得很好,但我不确定这是否是一个不好的方法,或者有更好的方法。 下面是完整的代码,任何input将不胜感激,甚至消极,但请build设性。 谢谢!! 视图模型: public class TestViewModel : DependencyObject { public ICommand Command1 { get; set; } public ICommand Command2 { get; set; } public ICommand Command3 { get; set; } public TestViewModel() { this.Command1 = new TestCommand(ExecuteCommand1, CanExecuteCommand1); this.Command2 = new TestCommand(ExecuteCommand2, CanExecuteCommand2); this.Command3 = new TestCommand(ExecuteCommand3, CanExecuteCommand3); } […]

如何从另一个类中运行的另一个线程更新UI

我目前正在编写我的第一个C#程序,我对这个语言非常陌生(以前只和C一起工作)。 我做了大量的研究,但是所有的答案都太笼统,我根本无法解决问题。 所以在这里,我的(很常见的)问题:我有一个WPF应用程序,它接受用户填充的几个文本框的input,然后使用它来做大量的计算。 他们大概需要2-3分钟,所以我想更新一个进度条和一个文本块告诉我目前的状态是什么。 另外我需要存储来自用户的UIinput,并将它们提供给线程,所以我有第三个类,我用它来创build一个对象,并希望将此对象传递给后台线程。 显然我会运行在另一个线程的计算,所以用户界面不冻结,但我不知道如何更新用户界面,因为所有的计算方法是另一类的一部分。 经过大量的研究,我认为最好的方法是使用调度员和TPL,而不是背景工作者,但老实说,我不知道他们是如何工作的,经过大约20个小时的反复试验,我决定问一个自己的问题。 这里有一个我的程序非常简单的结构: public partial class MainWindow : Window { public MainWindow() { Initialize Component(); } private void startCalc(object sender, RoutedEventArgs e) { inputValues input = new inputValues(); calcClass calculations = new calcClass(); try { input.pota = Convert.ToDouble(aVar.Text); input.potb = Convert.ToDouble(bVar.Text); input.potc = Convert.ToDouble(cVar.Text); input.potd = Convert.ToDouble(dVar.Text); input.potf = Convert.ToDouble(fVar.Text); […]

如何使用WPF和.NET 3.5注册一个全局热键来说CTRL + SHIFT +(LETTER)?

我使用WPF在C#中构build应用程序。 我怎样才能绑定到一些键? 另外,我怎样才能绑定到Windows键 ?

如何通过工作线程更新ObservableCollection?

我有一个ObservableCollection<A> a_collection; 该集合包含“n”个项目。 每个项目A看起来像这样: public class A : INotifyPropertyChanged { public ObservableCollection<B> b_subcollection; Thread m_worker; } 基本上,这是所有连线到一个WPF的listview +详细信息视图控制显示在一个单独的列表视图中select的项目(双向绑定,更新属性更新等)b_subcollection。 当我开始执行线程时,问题就出现了。 整个想法是让整个a_collection使用它的工作线程来“做功”,然后更新它们各自的b_subcollections并让gui实时显示结果。 当我尝试它时,我得到一个exception,说只有Dispatcher线程可以修改一个ObservableCollection,工作停下来。 任何人都可以解释这个问题,以及如何解决这个问题? 干杯

WPF模糊字体问题 – 解决scheme

问题在以下链接中进行了描述和演示: Paul Stovell WPF:模糊文本渲染 www.gamedev.net论坛 Microsoft Connect:WPF文本渲染器在小字号上生成严重模糊的文本 说明: WPF中的文本清晰度 。 这个链接有字体比较。 我想收集这个问题的所有可能的解决scheme。 Microsoft Expression Blend使用WPF,但字体看起来是可读的。 在Microsoft Expression Blend中使用深色背景 增加字体大小和改变字体(Calibri …) [link] embeddedWindows窗体[链接] 使用GDI +和/或Windows窗体TextRenderer类将文本呈现为位图,然后将该位图呈现为WPF控件。 [链接] 有没有更多的解决scheme? 这将在VS2010(和WPF4)beta2中得到解决 WPF 4.0文本堆栈的改进 它看起来已经最终解决了! Scott Hanselman的ComputerZen.com:WPF和Text Blurriness,现在完全清晰 WPF文本博客:其他WPF文本清晰度改进