Tag: wpf

从另一个viewmodel更新viewmodel

我有两个ViewModel,一个连接到主窗口,另一个连接到子窗口,通过单击主窗口上的按钮打开。 子窗口包含一个项目列表,我想选择一个项目,并通过更新主窗口视图模型在主窗口中显示它。 实现这一目标的最佳方法是什么? 谢谢!

WPF更新绑定到数组中的元素

我搜索了我的小心脏,完全有可能我错过了一些关键且明显的东西。 我有一个BitArray和一系列绑定到数组中元素的复选框,如下所示: … 他们正确地从该属性获取其值,但更改复选框似乎不会触发该属性的setter。 我尝试了一个非常简单的例子,其中一个TextBox绑定到一个字符串数组的元素。 class TestArray { private string[] _nameArray = new string[3]; public TestArray() { _nameArray[1] = “test name”; } public string[] NameArray { get { return _nameArray; } set { _nameArray = value; } } } 这是UI元素: 同样,这个TextBox从绑定中获取名称就好了,但是如果我改变它就不会击中setter。 这可能完全是一个傻瓜问题,可能源于严重缺乏理解,所以感谢您的耐心等待!

Windows启动时启动窗口

我希望我的应用程序(WPF Window )在Windows启动时启动。 我尝试了不同的解决方案,但似乎没有人工作。 我必须在我的代码中写一下这样做?

在ItemsControl中WPF中的可拖动对象?

我希望能够实现带有可拖动项目的ItemsControl。 ItemsControl的原因是我可以在后台绑定到我的ViewModel。 我尝试在canvas中使用Thumb控件并且它工作得很完美,除非我将它粘贴在ItemsControl中它就会停止工作。 这是我尝试过的: 背后的代码: public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); DataContext = new MainViewModel(); } private void MyThumb_DragDelta(object sender, System.Windows.Controls.Primitives.DragDeltaEventArgs e) { Canvas.SetLeft((UIElement)sender, Canvas.GetLeft((UIElement)sender) + e.HorizontalChange); Canvas.SetTop((UIElement)sender, Canvas.GetTop((UIElement)sender) + e.VerticalChange); } 最后我的ViewModel: public class MainViewModel : DependencyObject { public ObservableCollection MyItems { get; set;} public MainViewModel() { MyItems = […]

在WPF窗口和用户控件之间共享数据的最佳方法是什么?

WPF有时会令人愤怒。 我有一个相当简单的应用程序,它包含一个包含选项卡控件和几个选项卡的主窗口。 我不喜欢在同一个文件中使用所有选项卡的代码,因此我使用此问题的答案将每个选项卡分成单独的用户控件。 在我的主窗口中,我有一个包含应用程序设置的对象实例,以及一些其他应用程序范围的数据。 我的一些标签需要访问此数据以进行数据绑定。 我无法找到实现这一目标的好方法。 首先,我尝试访问控件Loaded事件中的父窗口,并在主窗口中获取对公开设置对象的属性的引用,如下面的代码所示。 除了Loaded事件之外,每次选项卡获得焦点时都会触发此类工作。 此外,此事件发生在控件生命周期的后期,因此我无法在用户控件XAML中绑定到此对象中的任何属性。 private void MyUserControl_Loaded(object sender, RoutedEventArgs e) { this.ApplicationSettings = ((MainWindow)Window.GetWindow(this)).ApplicationSettings; } 然后我尝试将数据传递给用户控件构造函数,但是在XAML中无法做到这一点。 鉴于这些是应用程序范围的设置,我可以使ApplicationSettings类单例并在任何地方引用它,但我宁愿不为unit testing目的这样做。 那么如何实现这样的目标呢? 我的方法是否存在根本缺陷? 在我看来,所有这些UI元素都是同一窗口的一部分,因此应该能够从主窗口访问数据,但对象模型似乎不允许这样做。

KeyDown事件不会从网格中引发

这里我有一个带网格的示例窗口。 我需要在按下按键时捕获事件。 但是当我点击网格区域然后按键时它不会升起。 它仅在Textbox聚焦时才有效。 我知道如果我从Window捕获它会有效。 但我有其他应用程序几乎没有用户控件,我需要从不同的应用程序捕获它。 我尝试为Window设置Focusable.false,为Grid设置为true,但它没有帮助。 有解决方案?

后台工作者在自己的class级处理

好吧,我有以下问题,希望你能帮助我: 我想创建一个带后台工作程序的WPF应用程序,用于更新richtextboxes和其他UI元素。 这个后台工作者应该处理一些数据,例如处理文件夹的内容,做一些解析等等。 因为我想在Main类之外移动尽可能多的代码,所以我创建了一个名为MyProcess.cs类,如下所示(事实上,到目前为止,这个类没有多大意义,它将填充更多处理元素,如果这个问题已经解决)。 一般function应该是: MainWindow:将创建一个字符串数组(名为this.folderContent ) MainWindow:后台工作者开始将此数组作为参数 MainWindow:将调用DoWork()方法(我知道,这个方法现在在一个新线程中运行) MyProcess:根据给定的字符串数组生成一个(迄今为止未格式化的)段落 MainWindow:如果后台工作程序完成,则调用RunWorkerCompleted()方法(在UI线程中运行),该方法应通过方法的返回参数更新WPF RichTextBox 最后一步导致带有注释的InvalidOperationsException,“调用线程无法访问此对象,因为另一个线程拥有它”。 我读了一下后台工作者类及其function。 所以我认为它与this.formatedFilenames.Inlines.Add(new Run(…))的Execute()方法中的this.formatedFilenames.Inlines.Add(new Run(…))调用MyProcess 。 如果我用字符串列表或类似的东西替换Paragraph属性(没有额外的new()调用)我可以通过get方法访问此成员而不会出现任何问题。 与我发现的后台工作者相关的所有示例都只返回基本类型或简单类。 MainWindow.xaml.cs public MainWindow() { InitializeComponent(); this.process = new MyProcess(); this.worker = new BackgroundWorker(); this.worker.DoWork += worker_DoWork; this.worker.RunWorkerCompleted += worker_RunWorkerCompleted; } private void worker_DoWork(object sender, DoWorkEventArgs e) { this.process.Execute((string[])e.Argument); e.Result = this.process.Paragraph(); } private void worker_RunWorkerCompleted(object […]

以编程方式对wpf数据网格进行排序

有没有办法对WPF DataGrid programmaticaly进行排序(例如,如果我点击我的第一列)。 有没有办法模拟这个点击? 还是最好的方式? 这是我的代码: Collection_Evenements = new ObservableCollection(); Collection_Evenements = myEvenement.GetEvenementsForCliCode(App.obj_myClient.m_strCode); Collection_Evenements.CollectionChanged += Collection_Evenements_CollectionChanged; myDataGridEvenements.ItemsSource = Collection_Evenements; System.Data.DataView dv = (System.Data.DataView)myDataGridEvenements.ItemsSource; dv.Sort = “strEvtType”; myDataGridEvenements.Focus(); myDataGridEvenements.SelectedIndex = 0; myDataGridEvenements.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next)); 我不知道为什么,但行“dv.Sort =”strEvtType“;” 导致一个奇怪的事情,我的窗口显示和程序不继续执行下一行,但我没有看到那种! 非常感谢, 最好的祝福, Nixeus

TextBlock与大写字母一样大(忽略字体ascender / descender)

我希望在TextBlock上获得特定的行为,使其高度仅包括大写字母的高度(从基线到顶部减去“上boost度”)。 请从维基百科看图像Sphinx ,看看我的意思。 此外,下面的图片可能更好地表明我所追求的。 我不是专门寻找纯XAML解决方案(可能是不可能的)所以后面的C#代码(转换器)也没问题。 这是XamlPad中用于在上图中生成左A的XAML。

WPF:自定义控件中的多个内容演示者?

我正在尝试使用自定义控件,该控件需要由子控件定义2个或更多XAML区域 – 从该控件inheritance。 我想知道是否有一种方法可以定义多个内容提供者和一个充当默认内容呈现者的方法 这是可能的,我如何在自定义控件的模板中定义它?