Questions tagged «wpf»

Windows Presentation Foundation或WPF是用于在基于Windows的应用程序中呈现用户界面的子系统。

8
MVVM没有意义吗?[关闭]
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案会得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 7年前关闭。 正统的MVVM实现是没有意义的吗?我正在创建一个新的应用程序,并且考虑了Windows Forms和WPF。我选择WPF是因为它可以面向未来并且具有很大的灵活性。使用XAML的代码更少,可以更轻松地对UI进行重大更改。 由于WPF的选择是显而易见的,因此我认为,最好还是使用MVVM作为我的应用程序体系结构,因为它提供了可混合性,分离性和单元可测试性。从理论上讲,它看起来像UI编程的圣杯一样美丽。这短暂的冒险;但是,已经变成了真正的头痛。正如实践中所期望的,我发现我已经将一个问题换成了另一个。我倾向于成为一个痴迷的程序员,因为我想以正确的方式做事,以便获得正确的结果,并有可能成为更好的程序员。MVVM模式使我的生产力测试不及格,并且变成了一个巨大的麻烦! 最明显的例子就是增加了对“模态”对话框的支持。正确的方法是建立一个对话框并将其绑定到视图模型。使其难以工作。为了从MVVM模式中受益,您必须在应用程序的各个层中的多个位置分发代码。您还必须使用诸如模板和lamba表达式之类的深奥编程结构。东西使您凝视屏幕,挠挠头。正如最近发现的那样,这使得维护和调试成为一场噩梦。我有一个about框可以正常工作,直到我第二次调用它时出现异常,然后说它一旦关闭就无法再次显示该对话框。我必须为对话框的关闭功能添加一个事件处理程序,IDialogView实现中的另一个,最后是IDialogViewModel中的另一个。我以为MVVM可以将我们从如此奢侈的黑客中拯救出来! 有好几个人在为这个问题提供竞争解决方案,他们都是黑客,不能提供干净,易于重用的优雅解决方案。大多数MVVM工具箱都会掩盖对话框,当它们确实解决对话框时,它们只是警报框,不需要自定义界面或视图模型。 我打算放弃MVVM视图模式,至少是它的正统实现。你怎么看?如果您有任何麻烦,对您来说值得吗?我只是一个能力不强的程序员,还是MVVM并不是它所宣传的那样?
91 .net  wpf  mvvm 

9
将焦点设置在XAML WPF中的文本框上
尽管在这个论坛上有一些帖子,还有一些我找不到可以告诉我如何把重点放在博客上的东西TextBox。 我有一个带有许多标签和文本框的userControl。加载表单时,我希望特定的textBox具有焦点。 我已经设置了tabIndex,但是似乎没有用。 有什么建议?
91 wpf  textbox  focus 


20
清除ObservableCollection时,e.OldItems中没有项目
我这里有些东西真的让我措手不及。 我有一个T的ObservableCollection,充满了项目。我还有一个附加到CollectionChanged事件的事件处理程序。 当您清除集合,将导致以e.Action设置为NotifyCollectionChangedAction.Reset一个CollectionChanged事件。好的,那很正常。但是奇怪的是e.OldItems或e.NewItems都没有任何内容。我希望e.OldItems充满从集合中删除的所有项目。 其他人看到了吗?如果是这样,他们如何解决呢? 一些背景:我正在使用CollectionChanged事件来附加和分离另一个事件,因此,如果我在e.OldItems中没有任何项目……我将无法从该事件分离。 澄清: 我确实知道文档并没有完全说明它必须采用这种方式。但是对于其他所有动作,它都会通知我已完成的操作。因此,我的假设是在“清除/重置”的情况下也会告诉我。 如果您想自己重现,下面是示例代码。首先关闭xaml: <Window x:Class="ObservableCollection.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> <Button x:Name="addButton" Content="Add" Width="100" Height="25" Margin="10" Click="addButton_Click"/> <Button x:Name="moveButton" Content="Move" Width="100" Height="25" Margin="10" Click="moveButton_Click"/> <Button x:Name="removeButton" Content="Remove" Width="100" Height="25" Margin="10" Click="removeButton_Click"/> <Button x:Name="replaceButton" Content="Replace" Width="100" Height="25" Margin="10" Click="replaceButton_Click"/> <Button x:Name="resetButton" Content="Reset" Width="100" Height="25" …


3
如何使用样式/模板格式化WPF中的小数位数?
我正在编写WPF程序,试图通过某种可重复的方法(例如样式或模板)来找到在TextBox中格式化数据的方法。我有很多TextBox(准确地说是95个),每个TextBox都绑定到自己的数字数据,每个数字数据都可以定义自己的分辨率。例如,如果数据是分辨率为2的99.123,则应显示99.12。同样,数据值99和分辨率3应该显示为99.000(而不是99)。有没有办法做到这一点? 编辑: 我应该澄清一下,我正在处理的当前屏幕上有95个文本框,但是我希望程序中各个屏幕上的每个文本框都显示正确的小数位数。现在,我考虑了一下,其中一些是TextBoxes(例如我现在正在处理的屏幕),一些是DataGrids或ListViews,但是如果我能弄清楚如何使其能够用于TextBoxes,我敢肯定,我可以以及其他控件。 在这种情况下,没有太多代码可共享,但是我将尝试使其更加清晰: 我有一个包含以下属性(vb.net)的视图模型: Public ReadOnly Property Resolution As Integer Get Return _signal.DisplayResolution End Get End Property Public ReadOnly Property Value As Single Get Return Math.Round(_signal.DisplayValue, Resolution) End Get End Property 在XAML中,我有: <UserControl.Resources> <vm:SignalViewModel x:Key="Signal" SignalPath="SomeSignal"/> </UserControl.Resources> <TextBox Grid.Column="3" IsEnabled="False" Text="{Binding Path=Value, Source={StaticResource Signal}, Mode=OneWay}" /> EDIT2(我的解决方案): 事实证明,离开计算机一段时间后,我回来找到一个简单的答案,令我望而却步。在视图模型中格式化数据! Public …


7
绑定到WPF中的方法?
在这种情况下,如何在WPF中绑定到对象方法? public class RootObject { public string Name { get; } public ObservableCollection<ChildObject> GetChildren() {...} } public class ChildObject { public string Name { get; } } XAML: <TreeView ItemsSource="some list of RootObjects"> <TreeView.Resources> <HierarchicalDataTemplate DataType="{x:Type data:RootObject}" ItemsSource="???"> <TextBlock Text="{Binding Path=Name}" /> </HierarchicalDataTemplate> <HierarchicalDataTemplate DataType="{x:Type data:ChildObject}"> <TextBlock Text="{Binding Path=Name}" /> …
90 .net  wpf  data-binding  xaml 

16
ComboBox- SelectionChanged事件具有旧值,而不是新值
C#、. NET 4.0,VS2010。 WPF的新手。我的MainWindow上有一个ComboBox。我迷上了所述组合框的SelectionChanged事件。但是,如果我在事件处理程序中检查组合框的值,则它具有旧值。这听起来更像是“ SelectionChanging”事件,而不是SelectionChanged事件。 实际发生选择后,如何获得ComboBox的新值? 目前: this.MyComboBox.SelectionChanged += new SelectionChangedEventHandler(OnMyComboBoxChanged); ... private void OnMyComboBoxChanged(object sender, SelectionChangedEventArgs e) { string text = this.MyComboBox.Text; } 注意,如果我使用在事件args egeOriginalSource事件中传递的对象,则会得到相同的行为。


9
在应用程序繁忙时显示沙漏
对于使用WPF构造的视图,我想在应用程序繁忙且无响应时将鼠标光标更改为沙漏。 一种解决方案是添加 this.Cursor = Cursors.Wait; 到所有可能导致UI无法响应的地方。但这显然不是最佳解决方案。我想知道实现这一目标的最佳方法是什么? 是否可以通过使用样式或资源来实现? 谢谢,
89 c#  wpf 

3
如果选中,则更改ListBox项目的WPF DataTemplate
我需要根据是否选择项目来更改列表框中项目的数据模板(选择时显示不同/更多信息)。 单击有问题的ListBox项(仅通过制表键)时,在DataTemplate(堆栈面板)的最顶层元素上没有出现GotFocus / LostFocus事件,并且我没有主意。
89 .net  wpf 

7
如何读取项目根目录中的文本文件?
我想阅读添加到项目根目录的文本文件的第一行。意思是,我的解决方案资源管理器在项目中的.cs文件旁边显示.txt文件。 因此,我尝试做: TextReader tr = new StreamReader(@"myfile.txt"); string myText = tr.ReadLine(); 但这是行不通的,因为它是指Bin文件夹,而我的文件不在其中...我该如何工作?:/ 谢谢
89 c#  wpf 

10
如何在WPF中自动调整GridViewColumn数据的大小并使其右对齐?
我怎么能够: 右对齐ID列中的文本 根据具有最长可见数据的单元格的文本长度,使各列自动调整大小? 这是代码: <ListView Name="lstCustomers" ItemsSource="{Binding Path=Collection}"> <ListView.View> <GridView> <GridViewColumn Header="ID" DisplayMemberBinding="{Binding Id}" Width="40"/> <GridViewColumn Header="First Name" DisplayMemberBinding="{Binding FirstName}" Width="100" /> <GridViewColumn Header="Last Name" DisplayMemberBinding="{Binding LastName}"/> </GridView> </ListView.View> </ListView> 部分答案: 感谢Kjetil,GridViewColumn.CellTemplate可以很好地工作,自动宽度也可以正常工作,但是当ObservativeCollection“ Collection”用比列宽长的数据更新时,列大小不会自动更新,因此这仅仅是解决方案初始显示数据: <ListView Name="lstCustomers" ItemsSource="{Binding Path=Collection}"> <ListView.View> <GridView> <GridViewColumn Header="ID" Width="Auto"> <GridViewColumn.CellTemplate> <DataTemplate> <TextBlock Text="{Binding Id}" TextAlignment="Right" Width="40"/> </DataTemplate> …

4
如何以编程方式设置网格行和列位置
我在Stackpanel中有两个网格。第一个网格名为GridX。最初,在网格内部,有一个二维的文本框数组(RowDefs / ColumnDefs)。XAML中的TextBox定义是 <TextBox x:Name="A1" Grid.Row="4" Grid.Column="5" TextAlignment="Center" /> 我想以编程方式在与GridX相同的位置添加TextBlock。 效果一定是这样 <TextBlock Grid.Row="4" Grid.Column="5" HorizontalAlignment="Left" VerticalAlignment="Top" Text="10" FontSize="8"/> 如何添加。我已经试过了: TextBlock tblock = new TextBlock(); GridX.SetColumn(tblock, cIndex); GridX.SetRow(tblock, rIndex); 但是失败了。 我再次尝试了这个: int rIndex = Grid.GetRow(txtBox); int cIndex = Grid.GetColumn(txtBox); TextBlock tblock = new TextBlock(); tblock.VerticalAlignment = VerticalAlignment.Top; tblock.HorizontalAlignment = HorizontalAlignment.Left; tblock.FontSize …
89 wpf  gridview 

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.