Windows Presentation Foundation或WPF是用于在基于Windows的应用程序中呈现用户界面的子系统。
TextBox 上的默认数据绑定是 TwoWay,仅当 TextBox 失去焦点时才会将文本提交到属性。 当我按下 En...时,是否有任何简单的 XAML 方法可以使数据绑定发生?
PowerShell - WPF DataGridView 在第一列和网格之间有一个小的额外间隙
在此处输入图像描述我正在使用 WPF 构建 PowerShell GUI 脚本。 DataGrid 控件有两列。 $dataGridView1 = 新对象 Windows.controls.DataGrid $dataGridView1.Name = '列表...
WPF CommandBindings、ViewModel 和 UserControl
我对 WPF 还很陌生,所以最好描述一下其意图: 我的主窗口内有多个用户控件。每个用户控件都有自己的按钮,我想将其绑定到
我用 C# 创建了一个 WPF 应用程序,具有 3 个不同的窗口:Home.xaml、Name.xaml、Config.xaml。我想在 Home.xaml.cs 中声明一个可以在其他形式中使用的变量。我尝试过做酒吧...
我不想使用由输入设备生成的事件,而是想使用一个自定义事件,该事件将在代码隐藏中以编程方式引发,作为我的 xaml 中的 EventTrigger。 这应该是可笑的...
WPF 数据网格从网格获取更改的值并在视图模型中捕获它(坚果当前值)
xaml 文件: xaml 文件: <DataGrid x:Name="BrugerDataGrid" AutoGenerateColumns="False" CanUserAddRows="True" CanUserDeleteRows="False" CanUserReorderColumns="False" CanUserResizeColumns="False" CanUserResizeRows="False" CanUserSortColumns="False" IsReadOnly="False" SelectionMode="Single" SelectionUnit="FullRow" ItemsSource="{Binding Brugere, Mode=TwoWay}"> <i:Interaction.Triggers> <i:EventTrigger EventName="RowEditEnding"> <i:InvokeCommandAction Command="{Binding RowEditEndingCommand}" CommandParameter="{Binding SelectedItem, ElementName=BrugerDataGrid}" PassEventArgsToCommand="True" /> </i:EventTrigger> </i:Interaction.Triggers> <!-- DataGrid columns --> 视图模型: public ObservableCollection<Bruger> Brugere { get; set; } public ICommand RowEditEndingCommand => new RelayCommand<Object>(OnRowEditEnding); private void OnRowEditEnding(Bruger bruger) { // bruger is autogenerated from entity framework } 我收到的布鲁格是网格中数据更改之前的值。我如何获取更改后的值,以便我可以将更改后的数据存储到我的数据库 我一直在尝试用这种方法添加一个事件, private void OnRowEditEnding(布鲁格·布鲁格,DataGridRowEditEndingEventArgs e) 但这会给我一个错误: 公共 ICommand RowEditEndingCommand => new RelayCommand(OnRowEditEnding); 说: 参数 1:无法从“方法组”转换为“System.Action” 我认为 PassEventArgsToCommand="True" 也许会让我这样做。 RowEditEnding 事件发生在之前提交或取消行编辑。 您应该做的是在您的 Bruger 类中实现 IEditableObject 接口并处理 EndEdit() 方法中的逻辑。 另一个选项是在视图的事件处理程序中显式提交编辑: private bool _handle = true; private void OnRowEditEnding(object sender, DataGridRowEditEndingEventArgs e) { if (_handle) { _handle = false; BrugerDataGrid.CommitEdit(); var updatedItem = e.Row.Item as Bruger; var viewModel = this.DataContext as YourViewModel; if (updatedItem != null && viewModel != null) viewModel.RowEditEndingCommand.Execute(updatedItem); _handle = true; } } 将事件参数传递给视图模型会破坏 MVVM 设计模式。在视图的代码隐藏中以编程方式调用命令则不然。
我正在尝试使用 WPF 树视图实现非常具体的外观。 给定这样的结构: H: └── 节目 └── 启动 ├── foo.txt ├── 栏.txt └── 啊啊啊 └── b...
如何在运行时在 VB 代码中更改 LinearGradientBrush 中特定 GradientStop 的颜色?
我在资源中有一个简单的线性渐变画笔,当在VB代码后面触发事件时,我试图在运行时更改特定渐变停止点的颜色。 这是线性渐变:...
如何将 WPF/XAML GridRow 的高度设置为 Auto,但仍将其限制为 Grid 的最大可用高度?
我有一个 GroupBox(包含一个 ListBox)和一个 Expander,每个都在网格内各自的行中: ...
我正在尝试更改分隔符在 WPF 上下文菜单中的显示方式。上下文菜单有自己的默认样式,它已经成功地将样式应用到其所有菜单项。 <question vote="1"> <p>我正在尝试更改分隔符在 WPF 上下文菜单中的显示方式。上下文菜单有自己的默认样式,它已经成功地将样式应用到其所有菜单项。</p> <pre><code><Style BasedOn="{StaticResource ContextMenuBaseStyle}" TargetType="{x:Type local:ViewportContextMenu}"> <!-- Defining this style in Style.Resources means ALL menu items within the Context Menu, no matter how nested, use this style by default. --> <Style.Resources> <Style BasedOn="{StaticResource MenuItemBaseStyle}" TargetType="{x:Type MenuItem}"> <!-- Set the icon of all menu items to the one associated with their data context --> <Setter Property="Icon" Value="{StaticResource ViewportMenuItemIcon}"/> </Style> <Style TargetType="{x:Type Separator}"> <!-- Make the separators big and red so I know this style is working. --> <Setter Property="Background" Value="Red"/> <Setter Property="Margin" Value="100"/> </Style> </Style.Resources> </Style> </code></pre> <p>通过将 MenuItem 样式定义为无键,并在 ContextMenu 样式的资源内,我似乎能够在 ContextMenu 控件范围内为 MenuItem 创建“默认样式”。</p> <p>我想我可以对分隔符做同样的事情,但这种样式似乎没有得到应用(与 WPF 的情况一样,很难弄清楚给定控件上实际激活的样式是什么)</p> </question> <answer tick="false" vote="0"> <p>当您刚刚设置 <pre><code>Style.TargetType</code></pre> 时,隐式 <pre><code>Style</code></pre> 将仅针对 <pre><code>Separator</code></pre>(或 <pre><code>Menu</code></pre>)之外的 <pre><code>ContextMenu</code></pre> 控件。这是因为 <pre><code>Menu</code></pre> 通过按键显式加载 <pre><code>Style</code></pre>。 该键被定义为 <a href="https://learn.microsoft.com/en-us/dotnet/api/system.windows.controls.menuitem.separatorstylekey?view=windowsdesktop-8.0#remarks" rel="nofollow noreferrer"><pre><code>MenuItem.SeparatorStyleKey</code></pre></a> 静态属性。 这意味着您必须显式覆盖使用此键的 <pre><code>Style</code></pre>,以便当 <pre><code>Menu</code></pre> 使用此键查找资源时找到您的自定义 <pre><code>Style</code></pre>:</p> <pre><code><Style x:Key="{x:Static MenuItem.SeparatorStyleKey}" TargetType="{x:Type Separator}"> <!-- Make the separators big and red so I know this style is working. --> <Setter Property="Background" Value="Red" /> <Setter Property="Margin" Value="10" /> </Style> </code></pre> <p>请注意,在设置子菜单项的样式时可能会遇到相同的问题。他们也使用显式键。<br/> 您可以查看 Microsoft Docs:<a href="https://learn.microsoft.com/en-us/dotnet/desktop/wpf/controls/menu-styles-and-templates?view=netframeworkdesktop-4.8#menu-and-menuitem-controltemplate-example" rel="nofollow noreferrer">Menu 和 MenuItem ControlTemplate 示例</a>以了解所使用的按键。</p> </answer> </body></html>
我有一个像这样的文本框 我有一个像这样的文本框 <TextBox Text="{Binding TransactionDetails.TransactionAmount, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Grid.Column="3" Grid.ColumnSpan="2" Grid.Row="5" x:Name="TextBoxAmount"/> 我将“TransactionAmount”设为 Double。它在整数值上运行良好,但是当我输入一些浮点值(例如 100.456)时,我无法输入“。” 每次值发生变化时,您都会更新您的属性。当您输入 . 时,它会被写入您的视图模型中并更新视图。 例如如果您输入 100.,它会四舍五入为 100,因此您永远不会看到任何点。 您有一些选项可以改变此行为: 使用延迟绑定: <TextBox Text="{Binding Path=TransactionDetails.TransactionAmount, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, Delay=250}" Grid.Column="3" Grid.ColumnSpan="2" Grid.Row="5" x:Name="TextBoxAmount" /> 仅在与保存的值不同时更改该值 (我建议每个绑定都使用这个): private double _transactionAmount; public double TransactionAmount { get { return _transactionAmount; } set { if (_transactionAmount != value) { _transactionAmount = value; Notify("TransactionAmount"); } } 或使用某种验证,例如验证异常。 当您的应用程序面向 .NET 4.0 或更早版本时,该行为符合预期,但后来发生了更改 (MSDN)。可以通过设置恢复旧的行为: System.Windows.FrameworkCompatibilityPreferences.KeepTextBoxDisplaySynchronizedWithTextProperty = false; 尽早设置(例如在 App.cs 的构造函数中),否则框架会引发异常。 来源及详细解释:https://web.archive.org/web/20220127083119/https://www.mobilemotion.eu/?p=1855 我通过使用StringFormat像得到的最佳解决方案 <TextBox Text="{Binding TransactionDetails.TransactionAmount, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged,StringFormat=N2}" Grid.Column="3" Grid.ColumnSpan="2" Grid.Row="5" x:Name="TextBoxAmount" /> 我们也可以根据要求定制字符串格式 您的问题出在 UpdateSourceTrigger 上。 你可以使用这样的东西,而不是在那里使用, private double amount; public double Amount { get { return amount; } set { amount= value; PropertyChanged(); Calculation(); } } PropertyChanged() 您将从 INotifyPropertyChanged 中获取它。欲了解更多信息,请点击此处 https://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged(v=vs.110).aspx 绑定双精度类型源数据时,可以用此类替换默认转换器。这样使用起来比较方便。下面是代码: public class double2txtConverter : IValueConverter { string _strCache; double _dCache; //Convert double to string of textbox. public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { if (_dCache == (double)value) return _strCache; else return value.ToString(); } //convert string to double; public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { _strCache = (string)value; _dCache = double.Parse(_strCache); return _dCache; } } //below is codebehind usage: Binding bd = new Binding(path); bd.Converter = new double2txtConverter(); bd.Source = source; bd.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged; txtTarget.SetBinding(TextBox.TextProperty, bd); 我根据上面Herm的回答给出答案。解释是正确的,但在控制上使用 Delay 并不能完全解决问题。如果最终用户输入0.005,则需要的延迟会更多,否则它将重新写入值为0。 相反,使用字符串属性进行绑定并尝试将其解析为双倍,并根据解析输出设置您需要的 long 值。在设置值之前进行您需要的所有类型的验证 private double _amount; private string _amountString; public string Amount { get { return _amountString;} set { double d=0; if(Double.TryParse(value, out d)) { _amountString=value; _amount=d; } } } } 在属性使用的绑定中,UpdateSourceTrigger=LostFocus。一旦文本框失去焦点,它将更新属性。 我通过附加属性解决了这个问题。 public class DoubleTextBox : TextBox { public string DoubleText { get => (string)GetValue(DoubleTextProperty); set => SetValue(DoubleTextProperty, value); } public static readonly DependencyProperty DoubleTextProperty = DependencyProperty.Register( nameof(DoubleText), typeof(string), typeof(DoubleTextBox), new FrameworkPropertyMetadata( string.Empty, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault | FrameworkPropertyMetadataOptions.Journal, new PropertyChangedCallback(OnDoubleTextChanged), null, true, UpdateSourceTrigger.LostFocus)); private static void OnDoubleTextChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { if (d is TextBox textBox) { var currentText = textBox.Text; var newText = (string)e.NewValue; if (currentText == newText) return; if ( double.TryParse(currentText, out var currentDouble) && double.TryParse(newText, out var newDouble) && currentDouble == newDouble ) return; textBox.Text = newText; } } protected override void OnTextChanged(TextChangedEventArgs e) { base.OnTextChanged(e); this.DoubleText = this.Text; } } 用途: <myControl:DoubleTextBox DoubleText="{Binding Double1, UpdateSourceTrigger=PropertyChanged}" />
如何在 WPF 中创建一个 2x2 网格,当元素改变可见性时调整大小
我正在尝试在 WPF 中创建一个包含两列和两行的网格。我希望网格以一种特殊的方式调整大小,具体取决于哪些单元格可见,我制作了一些插图以更好地表达...
包含“IWebBrowser”类型的 CefSharp DLL 在哪里?
由于扩展支持,我正在将我的应用程序从 Microsoft Edge WebView2 移植到 CefSharp,但是由于某种原因,IWebBrowser 似乎被放置在隐藏或未安装的 DLL 中...
WPF 有好的时间跨度控件吗?我正在寻找一个看起来像 WPF Toolkit 扩展中的 Timepicker(小而紧凑)的工具。我从 codeproject 看到的示例对于...
我这里有一个示例 wpf 应用程序,我想知道为什么 BMP 加载速度比 PNG 快。这是确切的设置: - Windows 7的 - 视觉工作室 2013 - 风景.png,1920x1080,2.4mb - 风景.bmp,1920x1...
我有两个页面和一个主窗口..我将页面加载到两个框架中..现在我想互相执行方法..我该怎么做? 这是Page1.cs: 公共部分类Page1:页面 {
使用 MediaElement 播放 Stream 中的视频
是否可以使用 WPF MediaElement 播放来自 System.IO.Stream 对象的流视频?正在从存储媒体文件的 WCF 服务中检索 Stream 对象。
我的窗口中显示了一条带有箭头的路径,他应根据属性“BarcodeScanne.MovementDirection”进行旋转,但是动画仅在值更改后播放,并且...
迁移到 .NET 5 后找不到类型“System.Web.UI.TagPrefixAttribute”
我使用升级助手 (https://dotnet.microsoft.com/platform/upgrade-assistant/) 将 .NET Framework 4.5.2 类库迁移到 .NET 5.0,并在 3 天后尝试修复后续构建...