Windows Presentation Foundation或WPF是用于在基于Windows的应用程序中呈现用户界面的子系统。
我有一个 UserControl,用作窗口对话框的“模板”。 它包含一个关闭按钮和一个取消按钮。 我有一个 UserControl,用作窗口对话框的“模板”。 它包含一个关闭按钮和一个取消按钮。 <UserControl x:Class="TombLib.WPF.Controls.WindowControlButtons" 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:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:local="clr-namespace:TombLib.WPF.Controls" mc:Ignorable="d" xmlns:darkUI="clr-namespace:DarkUI.WPF;assembly=DarkUI.WPF" xmlns:vm="clr-namespace:TombLib.WPF.ViewModels" xmlns:sg="clr-namespace:SpacedGridControl;assembly=SpacedGridControl" d:DesignHeight="100" d:DesignWidth="300" x:Name="root"> <StackPanel VerticalAlignment="Center" HorizontalAlignment="Right" Height="Auto" Orientation="Horizontal"> <Button Name="oKButton" Margin="{x:Static darkUI:Defaults.MediumThickness}" Width="100" Height="Auto" Command="{Binding Close}" CommandParameter="{Binding Window}" Content="OK"></Button> <Button Name="cancelButton" Margin="{x:Static darkUI:Defaults.MediumThickness}" Width="100" Height="Auto" Command="{Binding Path=Cancel}" CommandParameter="{Binding Window}" Content="Cancel"></Button> </StackPanel> </UserControl> public partial class WindowControlButtons : UserControl { public static readonly DependencyProperty CancelProperty = DependencyProperty.Register( nameof(Cancel), typeof(ICommand), typeof(WindowControlButtons), new PropertyMetadata(null)); public ICommand Cancel { get { return (ICommand)GetValue(CancelProperty); } set { SetValue(CancelProperty, value); } } public static readonly DependencyProperty CloseProperty = DependencyProperty.Register( nameof(Close), typeof(ICommand), typeof(WindowControlButtons), new PropertyMetadata(null)); public ICommand Close { get { return (ICommand)GetValue(CloseProperty); } set { SetValue(CloseProperty, value); } } public static readonly DependencyProperty WindowParameter = DependencyProperty.Register( nameof(Window), typeof(object), typeof(WindowControlButtons), new PropertyMetadata(null)); public object? Window { get { return GetValue(WindowParameter); } set { SetValue(WindowParameter, value); } } public WindowControlButtons() { InitializeComponent(); } } 我想在以下窗口中使用它: <Window x:Class="TombLib.WPF.Windows.SelectIdWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:TombLib.WPF.Windows" mc:Ignorable="d" xmlns:ctrl="clr-namespace:TombLib.WPF.Controls" xmlns:vm="clr-namespace:TombLib.WPF.ViewModels" xmlns:sg="clr-namespace:SpacedGridControl;assembly=SpacedGridControl" xmlns:darkUI="clr-namespace:DarkUI.WPF;assembly=DarkUI.WPF" Title="SelectIdWindow" Height="100" Width="300" d:DataContext="{d:DesignInstance Type=vm:SelectIdViewModel }" x:Name="Self"> <sg:SpacedGrid Margin="{x:Static darkUI:Defaults.MediumThickness}"> <!-- REDACTED --> <ctrl:WindowControlButtons DataContext="{Binding ElementName=Self}" Window="{Binding ElementName=Self, Mode=OneWay}" Close="{Binding CloseCommand,Mode=OneWay}" Cancel="{Binding CancelCommand,Mode=OneWay}" Height="Auto" Width="Auto" Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="2" HorizontalAlignment="Right"/> </sg:SpacedGrid> </Window> public partial class SelectIdWindow : Window { public ICommand? CloseCommand { get; set; } public ICommand? CancelCommand { get; set; } public SelectIdWindow() { CloseCommand = new WindowCloseCommand(); InitializeComponent(); } } public class SelectIdViewModel { public string RequestedId { get; set; } = string.Empty; public IEnumerable<string> TakenIds { get; set;} public SelectIdViewModel(IEnumerable<string> takenIDs) { TakenIds = takenIDs; } } 但是,当我打开窗口时如下: SelectIdWindow w = new SelectIdWindow(); var takenIDs = Entities.Select(kv => kv.Key.Name); w.DataContext = new SelectIdViewModel(takenIDs); w.ShowDialog(); 我在绑定 WindowControlButtons 时收到以下错误: DataContext 显式设置为 Self,它应该代表 Window,而不是 ViewModel。我在这里做错了什么? 绑定错误表明问题出在 Button.ICommand 属性上: 要修复此问题,请在 WindowControlButtons 绑定中添加 ElementName=root,以便绑定到声明的依赖项属性而不是 DataContext: <UserControl x:Class="TombLib.WPF.Controls.WindowControlButtons" 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:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:local="clr-namespace:TombLib.WPF.Controls" mc:Ignorable="d" xmlns:darkUI="clr-namespace:DarkUI.WPF;assembly=DarkUI.WPF" xmlns:vm="clr-namespace:TombLib.WPF.ViewModels" xmlns:sg="clr-namespace:SpacedGridControl;assembly=SpacedGridControl" d:DesignHeight="100" d:DesignWidth="300" x:Name="root"> <StackPanel VerticalAlignment="Center" HorizontalAlignment="Right" Height="Auto" Orientation="Horizontal"> <Button Name="oKButton" ... Command="{Binding Close, ElementName=root}" CommandParameter="{Binding Window, ElementName=root}" Content="OK"/> <Button Name="cancelButton" ... Command="{Binding Path=Cancel, ElementName=root}" CommandParameter="{Binding Window, ElementName=root}" Content="Cancel"/> </StackPanel> </UserControl>
我的 WPF 应用程序需要一个 PropertyGrid。经过大量搜索后我发现了这一点。 当我将 PropertyGrid 添加到表单并运行它时,我已经添加了程序集(exe 文件),但我在其中看不到它...
我正在通过数据绑定来绑定文本框的数据。而不是像这样给出最小值和最大值: 我正在通过数据绑定绑定文本框的数据。而不是像这样给出最小值和最大值: <TextBox Height="24" HorizontalAlignment="Right" abc:TextBoxMaskBehaviour.Mask="Decimal" abc:TextBoxMaskBehaviour.MinimumValue="0" abc:TextBoxMaskBehaviour.MaximumValue="200" Margin="0,9,8.5,0" Name="txtCStart" VerticalAlignment="Top" Width="106" MouseWheel="OnMouseWheel"> 我想通过 .xaml.cs 文件给出它。如何做到这一点? 显然(从你的评论来看,你的问题不是很清楚),你想通过C#代码设置abc:TextBoxMaskBehaviour.MinimumValue和MaximumValue: TextBoxMaskBehaviour.SetMinimumValue(txtCStart, 0); TextBoxMaskBehaviour.SetMaximumValue(txtCStart, 200); 一般来说,您可以像这样设置附加属性:AttachedPropertyClass.SetAttachedProperty(Control, Value)。同样,可以使用 AttachedPropertyClass.GetAttachedProperty(Control). 读取该值。 这看起来可能与 Rubenhak TextBoxMask 功能直接相关(因此我发现它想要回答这个确切的问题)。对于任何关注鲁本哈克的人来说,答案是: Rubenhak.Common.WPF.TextBoxMaskBehavior.SetMask( TextBoxControl, Rubenhak.Common.WPF.MaskType.Decimal); 同样适用于: Rubenhak.Common.WPF.TextBoxMaskBehavior.SetMinimumValue() Rubenhak.Common.WPF.TextBoxMaskBehavior.SetMaximumValue()
我有自定义基窗口类,样式(和模板)被覆盖,如果模板仅包含1个ContentPresenter(ContentSource =“Content”) - 它在设计器中显示良好,但如果我...
将文件名传递给 PrintDialog.PrintDocument
我有一个流程文档,需要将其写入 PDF 文件。使用下面的代码会打开一个对话框,询问文件名,然后生成 pdf。 var flowDocument = documentTemplate.LoadConte...
ClosedXML 导出数据网格到 Excel 仅 10 行
我有一个包含 60 行数据的数据网格和一个将其导入 Excel 的按钮: 我有一个包含 60 行数据的数据网格和一个将其导入 Excel 的按钮: <DataGrid AutoGenerateColumns="False" ItemsSource="{Binding Source}" CanUserAddRows="False" HeadersVisibility="All" Name="dgDisplay"> <DataGrid.Columns> <DataGridTextColumn Header="Day" Binding="{Binding Day}"/> <DataGridTextColumn Header="Data" Binding="{Binding Data}"/> </DataGrid.Columns> </DataGrid> <Button Command="{Binding SaveDataGridToExcelCommand}" CommandParameter="{Binding ElementName=dgDisplay}"/> 其中 Day 和 Data 只是一些随机生成的 int 数据。 我的代码使用 ClosedXML 将数据从中导出到 Excel,它使用 MainWindowViewModel: ObservableObject 调用 MVVM.Toolkit。 [RelayCommand] public void SaveDataGridToExcel(DataGrid dataGrid) { DataTable dt = new DataTable(); foreach (DataGridColumn column in dataGrid.Columns) { dt.Columns.Add(column.Header.ToString()); } foreach (var item in dataGrid.Items) { DataRow dr = dt.NewRow(); bool rowHasData = false; for (int i = 0; i < dataGrid.Columns.Count; i++) { var cellContent = dataGrid.Columns[i].GetCellContent(item); if (cellContent is TextBlock textBlock) { //check if row empty, dont add this row.I add it on purpose to check //if the datagrid recognite the rest 50 rows not have data. It actually //dont save those data dr[i] = textBlock.Text; if (!string.IsNullOrEmpty(textBlock.Text)) { rowHasData = true; } } } if (rowHasData) { dt.Rows.Add(dr); } } SaveFileDialog saveFileDialog = new SaveFileDialog(); saveFileDialog.Filter = "Excel files (*.xlsx)|*.xlsx"; if (saveFileDialog.ShowDialog() == DialogResult.OK) { using (XLWorkbook wb = new XLWorkbook()) { wb.Worksheets.Add(dt, "Sheet1"); wb.SaveAs(saveFileDialog.FileName); } } } 但是保存的60行结果只显示了10行数据,其余50行都是空的。如果疑问为什么不使用Microsoft.Interop.Excel,那是因为该包不适合我的 Excel 版本。我没有在 ClosedXML 中看到任何对此有限制或许可的地方,所以我想知道为什么。如有任何帮助,我们将不胜感激。 在浏览 github 几个小时后,我自己找到了答案。 我没有访问单元格内容,而是直接从 DataGrid 的 ItemsSource 访问数据: public void SaveDataGridToExcel(DataGrid dataGrid) { DataTable dataTable = new DataTable(); foreach (DataGridColumn column in dataGrid.Columns) { dataTable.Columns.Add(column.Header.ToString()); } var itemsSource = dataGrid.ItemsSource as IEnumerable; if (itemsSource != null) { foreach (var item in itemsSource) { var properties = item.GetType().GetProperties(); var row = dataTable.NewRow(); foreach (var property in properties) { row[property.Name] = property.GetValue(item); } dataTable.Rows.Add(row); } } //show dialog... }
我想使用 C# 连接到我的 Basler ace acA1440-73gm 相机。 我将在 .NET7.0 中的 WPF 应用程序中使用它。 要下载哪些 Nuget 包以及如何连接到相机? 我已经安装了...
自定义 ListViewItem 控件显示类名称,而常规 ListView 控件显示实际数据
以下是 WPF 应用程序的代码片段,其中我使用 ListView 控件和自定义 ListView 控件,但在 UI 中自定义 ListView 控件显示类名称,其中为 List View
当我将鼠标悬停在按钮上时,如何使按钮中的内容在 WPF 中移动位置?
当我将鼠标悬停在 WPF (C#) 中的按钮上时,我希望按钮中的文本作为动画向上移动到不同的位置,从按钮的中心到顶部。 我目前有这个 XAML ...
如何从 C# WPF 中的嵌入字体将字体文件添加到 Stimulsoft 报告
我使用 C# WPF 和 Stimulsoft 我想在需要显示时发送我的字体文件嵌入到我的报告中的路径 我在 WPF 项目中嵌入了字体,并且像这样使用它: 在 XAML 中: 我使用 C# WPF 和 Stimulsoft 我想在需要显示时发送我的字体文件嵌入到我的报告中的路径 我在 我的 WPF 项目中嵌入了字体,我这样使用它: 在 XAML 中: <Label x:Name="preloader" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" Content="Loading . . ." Margin="319,178,48,34" FontFamily="/WpfApp5;component/FNT/#B Titr" FontSize="48" Background="White"/> 字体是从我的项目中的字体文件夹嵌入的: 我的报告是在 stimulsoft 中生成的,我无法嵌入字体,但我可以向它发送我的字体路径 在此输入链接描述 通过这个我可以发送我的字体路径: 为此我尝试了两种方法 C# 代码: 1- : StiFontCollection.AddFontFile(@"pack://application:,,,/FNT/#B Titr"); 这种情况会显示此错误: System.NotSupportedException:“不支持给定路径的格式。” 2- : var fntpath = Assembly.GetEntryAssembly().GetManifestResourceStream("WpfApp5.FNT.BTITRBD.TTF"); StiFontCollection.AddFontFile(fntpath.ToString()); 并且在此 fntpath.ToString() 为 null ! 如何做到这一点? 请帮忙 AddFontFile方法需要磁盘上物理文件的路径。您无法传入 pack: URI,因为它不理解该格式。而且您不能只在 .ToString() 上调用 Stream,因为这不会产生任何有意义的信息。 您需要将字体文件提取到临时文件,并将该文件的路径传递给 AddFontFile 方法。 string tempPath = Path.GetTempPath(); string fileName = "WpfApp5.FNT.BTITRBD.TTF"; string fontPath = Path.Combine(tempPath, fileName); if (!File.Exists(fontPath)) { using (var stream = Assembly.GetEntryAssembly().GetManifestResourceStream(fileName)) using (var output = File.Create(fontPath)) { stream.CopyTo(output); } } StiFontCollection.AddFontFile(fontPath); var report = new StiReport(); var reportPath = System.Web.Hosting.HostingEnvironment.MapPath($@"~/Reports/{reportItem.FileName}"); Stimulsoft.Base.StiFontCollection.AddFontFile(System.Web.Hosting.HostingEnvironment.MapPath($@"~/fonts/Samim.ttf")); Stimulsoft.Base.StiFontCollection.AddFontFile(System.Web.Hosting.HostingEnvironment.MapPath($@"~/fonts/IRANSansWeb.ttf")); report.Load(reportPath); report.RegBusinessObject("customer", customerModel); report.RegBusinessObject("receipt", receiptModel); report.RegBusinessObject("order", orderModel); report.Render(false);
当我尝试将窗口的高度和宽度绑定到视图模型中的属性时遇到一些问题。这是一个小示例应用程序来说明该问题。这是app.xaml.xs中的代码 公开
如何使用 PowerShell、WPF 和 XAML 从 DataGrid 中删除选定的行?
您好, 我对使用 PowerShell 的 WPF 有点陌生。我的实际要求是在单击按钮时从 DataGrid 中删除选定的行。因此,单击按钮后,选定的行应该消失...
使用 ListBoxItem 上的简单触发器 IsMouseOver 绑定属性(数据触发器)
我看过SO上的多篇帖子,我正在使用其中一篇经过验证的帖子(一种解决方案)作为我的解决方案(我已经适应了我的上下文),但是当我使用相同的东西时,它不好: 线 <
我想要一个类似于复选框的单选按钮,所以我在字典文件中定义了一个样式,例如: 我想要一个类似于复选框的单选按钮,所以我在字典文件中定义了一个样式,例如: <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="clr-namespace:WpfCheckBoxLikeRadiobutton"> <Style x:Key="MyRadioButton" TargetType="{x:Type RadioButton}"> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type RadioButton}"> <Grid> <CheckBox IsChecked="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=IsChecked, Mode=TwoWay}" IsHitTestVisible="False" /> <CheckBox IsChecked="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=IsChecked, Mode=TwoWay}" Opacity="0"/> </Grid> </ControlTemplate> </Setter.Value> </Setter> </Style> 并将其合并到 app.xaml 文件中,如下所示 <Application x:Class="WpfCheckBoxLikeRadiobutton.App" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="clr-namespace:WpfCheckBoxLikeRadiobutton" StartupUri="MainWindow.xaml"> <Application.Resources> <ResourceDictionary> <ResourceDictionary.MergedDictionaries> <ResourceDictionary Source="Dictionary1.xaml" /> </ResourceDictionary.MergedDictionaries> </ResourceDictionary> </Application.Resources> 然后在我的窗口中使用它 <GroupBox Margin="5" Padding="5"> <StackPanel > <CheckBox Content="this is checkbox" /> <RadioButton Content="this is first radio button" Style="{DynamicResource MyRadioButton}"/> <RadioButton Content="this is Second radio button" Style="{DynamicResource MyRadioButton}"/> <RadioButton Content="this is third radio button" Style="{DynamicResource MyRadioButton}"/> </StackPanel> </GroupBox> 但是为单选按钮指定样式后,该内容将消失。 我的风格有什么问题吗? 发生这种情况是因为您忽略了自己的控制内容ControlTemplate。你的风格应该是这样的: <Style x:Key="MyRadioButton" TargetType="{x:Type RadioButton}"> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type RadioButton}"> <Grid> <CheckBox IsChecked="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=IsChecked, Mode=TwoWay}" IsHitTestVisible="False" Content="{TemplateBinding Content}" /> <CheckBox IsChecked="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=IsChecked, Mode=TwoWay}" Content="{TemplateBinding Content}" Opacity="0"/> </Grid> </ControlTemplate> </Setter.Value> </Setter> 我认为你甚至可以做得更简单,让它看起来更好,只需右键单击 --> EditStyle 并用模板中的矩形替换每个椭圆。有很多动画你不会因为这种方式而丢失。 这就是我所做的,看起来不错,如果你愿意,你也可以从复选框样式中复制“CheckIcon”,使其看起来完全像一个复选框。 除了 Verbon 的答案之外,我还有一种样式,其中复选框看起来像单选按钮。 <Style x:Key="CheckBoxRadioButtonStyle" TargetType="CheckBox"> <Setter Property="Background" Value="Transparent"/> <Setter Property="Foreground" Value="{ThemeResource SystemControlForegroundBaseHighBrush}"/> <Setter Property="Padding" Value="3"/> <Setter Property="HorizontalAlignment" Value="Center"/> <Setter Property="VerticalAlignment" Value="Center"/> <Setter Property="HorizontalContentAlignment" Value="Left"/> <Setter Property="VerticalContentAlignment" Value="Center"/> <Setter Property="FontFamily" Value="{ThemeResource ContentControlThemeFontFamily}"/> <Setter Property="FontSize" Value="{ThemeResource ControlContentThemeFontSize}"/> <Setter Property="MinWidth" Value="30"/> <Setter Property="UseSystemFocusVisuals" Value="True"/> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="CheckBox"> <Grid BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}"> <Grid.ColumnDefinitions> <ColumnDefinition Width="20"/> <ColumnDefinition Width="*"/> </Grid.ColumnDefinitions> <VisualStateManager.VisualStateGroups> <VisualStateGroup x:Name="CommonStates"> <VisualState x:Name="Normal"/> <VisualState x:Name="PointerOver"> </VisualState> <VisualState x:Name="Pressed"> <Storyboard> <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Stroke" Storyboard.TargetName="OuterEllipse"> <DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource SystemControlHighlightBaseMediumBrush}"/> </ObjectAnimationUsingKeyFrames> <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Stroke" Storyboard.TargetName="CheckOuterEllipse"> <DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource SystemControlHighlightBaseMediumBrush}"/> </ObjectAnimationUsingKeyFrames> <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Fill" Storyboard.TargetName="CheckOuterEllipse"> <DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource SystemControlHighlightTransparentBrush}"/> </ObjectAnimationUsingKeyFrames> <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Fill" Storyboard.TargetName="CheckGlyph"> <DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource SystemControlHighlightAltBaseMediumBrush}"/> </ObjectAnimationUsingKeyFrames> </Storyboard> </VisualState> <VisualState x:Name="Disabled"> <Storyboard> <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Stroke" Storyboard.TargetName="OuterEllipse"> <DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource SystemControlDisabledBaseLowBrush}"/> </ObjectAnimationUsingKeyFrames> <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Stroke" Storyboard.TargetName="CheckOuterEllipse"> <DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource SystemControlDisabledBaseLowBrush}"/> </ObjectAnimationUsingKeyFrames> <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Fill" Storyboard.TargetName="CheckOuterEllipse"> <DiscreteObjectKeyFrame KeyTime="0" Value="Transparent"/> </ObjectAnimationUsingKeyFrames> <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Fill" Storyboard.TargetName="CheckGlyph"> <DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource SystemControlDisabledBaseLowBrush}"/> </ObjectAnimationUsingKeyFrames> <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Foreground" Storyboard.TargetName="ContentPresenter"> <DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource SystemControlDisabledBaseLowBrush}"/> </ObjectAnimationUsingKeyFrames> </Storyboard> </VisualState> </VisualStateGroup> <VisualStateGroup x:Name="CheckStates"> <VisualState x:Name="Checked"> <Storyboard> <DoubleAnimation Duration="1" To="0" Storyboard.TargetProperty="Opacity" Storyboard.TargetName="CheckGlyph"/> <DoubleAnimation Duration="0" To="1" Storyboard.TargetProperty="Opacity" Storyboard.TargetName="OuterEllipse"/> <DoubleAnimation Duration="0" To="0" Storyboard.TargetProperty="Opacity" Storyboard.TargetName="CheckOuterEllipse"/> </Storyboard> </VisualState> <VisualState x:Name="Unchecked"> <Storyboard> <DoubleAnimation Duration="0" To="0" Storyboard.TargetProperty="Opacity" Storyboard.TargetName="OuterEllipse"/> <DoubleAnimation Duration="0" To="1" Storyboard.TargetProperty="Opacity" Storyboard.TargetName="CheckOuterEllipse"/> <DoubleAnimation Duration="0" To="1" Storyboard.TargetProperty="Opacity" Storyboard.TargetName="CheckGlyph"/> </Storyboard> </VisualState> <VisualState x:Name="Indeterminate"/> </VisualStateGroup> </VisualStateManager.VisualStateGroups> <Grid Height="32" VerticalAlignment="Top"> <Ellipse x:Name="OuterEllipse" Height="20" Fill="Green" Stroke="Green" Opacity="0" StrokeThickness="{ThemeResource RadioButtonBorderThemeThickness}" UseLayoutRounding="False" Width="20"/> <Ellipse x:Name="CheckOuterEllipse" Fill="White" Height="20" Opacity="1" Stroke="Gray" StrokeThickness="{ThemeResource RadioButtonBorderThemeThickness}" UseLayoutRounding="False" Width="20"/> <Ellipse x:Name="CheckGlyph" Fill="White" Height="12" Opacity="1" UseLayoutRounding="False" Width="12"/> </Grid> <ContentPresenter x:Name="ContentPresenter" AutomationProperties.AccessibilityView="Raw" ContentTemplate="{TemplateBinding ContentTemplate}" ContentTransitions="{TemplateBinding ContentTransitions}" Content="{TemplateBinding Content}" Grid.Column="1" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" TextWrapping="Wrap" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/> </Grid> </ControlTemplate> </Setter.Value> </Setter> </Style> 然后将上面的样式合并到Verbon的样式中: <Grid> <CheckBox IsChecked="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=IsChecked, Mode=TwoWay}" IsHitTestVisible="False" Content="{TemplateBinding Content}" Style="{StaticResource CheckBoxRadioButtonStyle}"/> <CheckBox IsChecked="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=IsChecked, Mode=TwoWay}" Content="{TemplateBinding Content}" Opacity="0" Style="{StaticResource CheckBoxRadioButtonStyle}"/> </Grid>
DataGrid 列表 = (DataGrid)sender; DataRowView row_selected = list.SelectedItem as DataRowView; if (row_selected != null) { // 数据表 dt = pad.Selectbrand(); ...
我正在使用 kinect SDK 和 OpenCV 开发一个 wpf 项目, 我需要做的是创建一个盒子,跟随 kinect 相机中显示的斑点,并检查斑点是否在矩形内
公共类 MyModel :INotifyPropertyChanged { 私有 MyEnum _myEnumValue; 公共 MyEnum MyEnumValue { 获取=> _myEnumValue; 放 { 如果(值==
我正在尝试搜索其中包含事件日志的文件夹,eventpath 具有我想要访问的特定事件日志的路径。我想使用指定的 RecordID 来查找它的相关性
我的 WPF 应用程序顶部有一个带有按钮的栏,允许用户在屏幕之间切换。 XAML: // 费用调查按钮 我的 WPF 应用程序顶部有一个带有按钮的栏,允许用户在屏幕之间切换。 XAML: // FEE SURVEY BUTTON <Menu:Btn Command="{Binding FeeSurveyCommand}" IsChecked="{Binding NavBar.FeeSurvey}" Style="{StaticResource NavButton}"> </Menu:Btn> // PRACTICE SNAPSHOT BUTTON <Menu:Btn Command="{Binding PracticeSnapshotCommand}" IsChecked="{Binding NavBar.PracticeSnapshot}" Style="{StaticResource NavButton}"> </Menu:Btn> // CONTENTS which dynamically changes when users click on the buttons <ContentControl x:Name="Pages" Grid.Column="1" Margin="25,0" Content="{Binding CurrentView}" /> 视图模型: private object _currentView; public object CurrentView { get { return _currentView; } set { _currentView = value; OnPropertyChanged(); } } public ICommand FeeSurveyCommand { get; set; } public ICommand PracticeSnapshotCommand { get; set; } private void FeeSurvey(object obj) { CurrentView = new FeeSurveyVM(); } private void PracticeSnapshot(object obj) { CurrentView = new PracticeSnapshotVM(); } // CONSTRUCTOR public MainViewVM() { FeeSurveyCommand = new RelayCommand(FeeSurvey); PracticeSnapshotCommand = new RelayCommand(PracticeSnapshot); } 因此,当用户单击按钮时,它将创建视图模型的实例(例如 FeeSurveyVM 或 PracticeSnapshotVM)。每个视图模型都与一个视图相关联。渲染新视图时,会调用多个 API。我遇到的问题是当用户切换视图时,API 调用不会中止。假设有人在这些视图之间来回切换,如果 API 调用出现错误(例如 404、400、500 错误),即使我已切换到,也会显示一堆先前访问过的视图的错误消息另一种观点。当视图发生变化时,有没有办法取消/中止这些 API 调用?我一直在寻找解决方案,但没有运气。 这看起来更像是设计错误。您可以尝试这些选项: 防止显示来自用户必须交互的 API 的错误消息,例如通过弹出窗口/消息框。只需添加一个带有输出的 TextBox/RichTextBox 控件,这样用户就会意识到错误,但不会因为弹出窗口而感到沮丧。 您可以禁用允许用户在视图之间切换的 UI 控件,直到 API 调用完成。最好在 API 调用过程中禁用整个视图。显示进度条或通知用户 API 调用期间发生的情况 CancellationTokenSource 应该取消执行 API 调用的异步任务,而不是那些已经调用的任务。因此,在这种情况下用户将观察到错误消息。注意你的设计。 UI 和逻辑。