wpf 相关问题

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

在购物车图标上定位商品计数圆圈

我正在尝试将商品计数圆圈放置在购物车图标上。当我设置边距来调整项目圆圈时,它会开箱即用。见下图: 这是带有

回答 1 投票 0

WPF ImageSource 与自定义转换器绑定

我有一个简单的组合框模板,其结构如下: 我有一个以这种方式构造的组合框的简单模板: <ComboBox DockPanel.Dock="Left" MinWidth="100" MaxHeight="24" ItemsSource="{Binding Actions}"> <ComboBox.ItemTemplate> <DataTemplate> <StackPanel Orientation="Horizontal"> <TextBlock Text="{Binding Name}" Width="100" /> <Image Source="{Binding Converter={StaticResource TypeConverter}}" /> </StackPanel> </DataTemplate> </ComboBox.ItemTemplate> </ComboBox> 所以,如果我使用这段代码,一切都会正常: <TextBlock Text="{Binding Name}" Width="100" /> <!--<Image Source="{Binding Converter={StaticResource TypeConverter}}" /> --> <Image Source="{StaticResource SecurityImage}" /> 但是如果我使用转换器,它就不再起作用了。 这是转换器,但我不知道如何从那里引用静态资源... public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { var type = (Action)value; var img = new BitmapImage(); switch (type.ActionType) { case ActionType.Security: img.UriSource = new Uri("StructureImage", UriKind.Relative); break; case ActionType.Structural: img.UriSource = new Uri("SecurityImage", UriKind.Relative); break; } return img; } 尝试使用 Josh 编写的 Switch Converter,应该对你有用: SwitchConverter – XAML 的“switch 语句”- http://josheinstein.com/blog/index.php/2010/06/switchconverter-a-switch-statement-for-xaml/ 无需编写转换器,您的代码将如下所示 - <Grid.Resources> <e:SwitchConverter x:Key="ActionIcons"> <e:SwitchCase When="Security" Then="SecurithImage.png" /> <e:SwitchCase When="Structural" Then="StructureImage.png" /> </e:SwitchConverter> </Grid.Resources> <Image Source="{Binding Converter={StaticResource ActionIcons}}" /> 更新1: 这是 SwitchConverter 的代码,因为 Josh 的 网站似乎已关闭 - /// <summary> /// A converter that accepts <see cref="SwitchConverterCase"/>s and converts them to the /// Then property of the case. /// </summary> [ContentProperty("Cases")] public class SwitchConverter : IValueConverter { // Converter instances. List<SwitchConverterCase> _cases; #region Public Properties. /// <summary> /// Gets or sets an array of <see cref="SwitchConverterCase"/>s that this converter can use to produde values from. /// </summary> public List<SwitchConverterCase> Cases { get { return _cases; } set { _cases = value; } } #endregion #region Construction. /// <summary> /// Initializes a new instance of the <see cref="SwitchConverter"/> class. /// </summary> public SwitchConverter() { // Create the cases array. _cases = new List<SwitchConverterCase>(); } #endregion /// <summary> /// Converts a value. /// </summary> /// <param name="value">The value produced by the binding source.</param> /// <param name="targetType">The type of the binding target property.</param> /// <param name="parameter">The converter parameter to use.</param> /// <param name="culture">The culture to use in the converter.</param> /// <returns> /// A converted value. If the method returns null, the valid null value is used. /// </returns> public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { // This will be the results of the operation. object results = null; // I'm only willing to convert SwitchConverterCases in this converter and no nulls! if (value == null) throw new ArgumentNullException("value"); // I need to find out if the case that matches this value actually exists in this converters cases collection. if (_cases != null && _cases.Count > 0) for (int i = 0; i < _cases.Count; i++) { // Get a reference to this case. SwitchConverterCase targetCase = _cases[i]; // Check to see if the value is the cases When parameter. if (value == targetCase || value.ToString().ToUpper() == targetCase.When.ToString().ToUpper()) { // We've got what we want, the results can now be set to the Then property // of the case we're on. results = targetCase.Then; // All done, get out of the loop. break; } } // return the results. return results; } /// <summary> /// Converts a value. /// </summary> /// <param name="value">The value that is produced by the binding target.</param> /// <param name="targetType">The type to convert to.</param> /// <param name="parameter">The converter parameter to use.</param> /// <param name="culture">The culture to use in the converter.</param> /// <returns> /// A converted value. If the method returns null, the valid null value is used. /// </returns> public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { throw new NotImplementedException(); } } /// <summary> /// Represents a case for a switch converter. /// </summary> [ContentProperty("Then")] public class SwitchConverterCase { // case instances. string _when; object _then; #region Public Properties. /// <summary> /// Gets or sets the condition of the case. /// </summary> public string When { get { return _when; } set { _when = value; } } /// <summary> /// Gets or sets the results of this case when run through a <see cref="SwitchConverter"/> /// </summary> public object Then { get { return _then; } set { _then = value; } } #endregion #region Construction. /// <summary> /// Switches the converter. /// </summary> public SwitchConverterCase() { } /// <summary> /// Initializes a new instance of the <see cref="SwitchConverterCase"/> class. /// </summary> /// <param name="when">The condition of the case.</param> /// <param name="then">The results of this case when run through a <see cref="SwitchConverter"/>.</param> public SwitchConverterCase(string when, object then) { // Hook up the instances. this._then = then; this._when = when; } #endregion /// <summary> /// Returns a <see cref="System.String"/> that represents this instance. /// </summary> /// <returns> /// A <see cref="System.String"/> that represents this instance. /// </returns> public override string ToString() { return string.Format("When={0}; Then={1}", When.ToString(), Then.ToString()); } } 更新2: 来自 Microsoft 参考源的另一个 SwitchConverter 实现。 使用Image.UriSource时,如果图像已添加到您的项目中并且其“构建操作”已设置为“资源”,则需要指定图像的相对文件路径。 例如。如果您已将图像放在 Visual Studio 中名为“images”的项目文件夹中,则可以通过以下方式引用图像: img.UriSource = new Uri("/Images/StructureImage.png", UriKind.Relative); 如果图像未构建为资源,则必须使用完整文件路径,即 img.UriSource = new Uri("http://server/Images/StructureImage.png", UriKind.Absolute); 编辑: 如果您将图像放入应用程序资源字典中,您始终可以通过以下方式访问它: Application.Current.Resources["StructureImage"]; 如果您将资源放在其他地方,您可以使用 IMultiValueConverter 而不是 IValueConverter 作为转换器。 那么你的类型转换器将如下所示: class TestValueConverter : IMultiValueConverter { #region IMultiValueConverter Members public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture) { // Validation of parameters goes here... var type = (Action) values[0]; var image1 = values[1]; var image2 = values[2]; if (type.ActionType == ActionType.Security) { return image1; } else { return image2; } } public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture) { throw new NotImplementedException(); } #endregion } 您的 XAML 看起来与此类似: <Image> <Image.Source> <MultiBinding Converter="{StaticResource testValueConverter}"> <Binding Path="Action" /> <Binding Source="{StaticResource SecurityImage}" /> <Binding Source="{StaticResource StructureImage}" /> </MultiBinding> </Image.Source> </Image> 最后,这就是您定义资源的方式: <imaging:BitmapImage x:Key="StructureImage" UriSource="StructureImage.png" /> <imaging:BitmapImage x:Key="SecurityImage" UriSource="SecurityImage.png" /> <local:TestValueConverter x:Key="testValueConverter" /> 以上代码未经测试! 虽然接受的答案很好,但我通常会避免“组合框”中带有图像的转换器的复杂性。我通常将图像源 (uri) 的数据类型定义为字符串。这样,就不需要转换器了。下面是一个分步示例: 第1步:创建语言对象类 public class Language { public int Id { get; set; } public string Code { get; set; } = string.Empty; public string Name { get; set; } = string.Empty; public string Uri { get; set; } = string.Empty; } 第 2 步:在视图模型或隐藏代码中创建语言对象的数组 public class ExampleViewModel { private ObservableCollection<Language>? _languages; public IEnumerable<Language>? Languages => _languages; public ExampleViewModel() { string baseUri = "pack://application:,,,/;component/Images"; // The following static data can also come from the database _languages = [ new() { Id = 2, Code = "en-GB", Name = "English", Uri = $"{baseUri}/gb.png" }, new() { Id = 1, Code = "de-DE", Name = "German", Uri = $"{baseUri}/de.png" } ]; } } 第3步:在视图中创建组合框 XAML: <ComboBox x:Name="cbxLanguageSelection" Margin="0,0,0,0" HorizontalAlignment="Left" Background="Transparent" BorderThickness="0" ItemsSource="{Binding Languages}" SelectedItem="{Binding SelectedLanguage, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Style="{StaticResource ResourceKey=ComboBoxStyle}" ToolTip="Language Selection" Visibility="Visible"> <ComboBox.ItemTemplate> <DataTemplate> <StackPanel Orientation="Horizontal" Style="{StaticResource ResourceKey=DropDownStyle}"> <Image Height="18" Margin="0,0,5,0" Source="{Binding Path=Uri}" /> <TextBlock Text="{Binding Path=Name}" /> </StackPanel> </DataTemplate> </ComboBox.ItemTemplate> </ComboBox> *)请注意,样式和“SelectedLanguage”是可选的。 “SelectedLanguage”属性应在实现时在视图模型或代码隐藏中创建。

回答 3 投票 0

WPF - 适合嵌套网格的控件大小

使用 WPF,我的布局是一系列嵌套网格,因为我的理解是,这比使用 RowSpan 更能保留我想要的外观。每个生成的网格部分都是一个区域,

回答 1 投票 0

在 DependencyProperty 的 CoerceValueCallback 中取消更新时如何更新绑定的源?

我有一个控件(在下面的示例中名为 GridView)和一个视图模型,它们通过其 SelectedValue 属性上的 2 路绑定进行绑定。我想禁止

回答 2 投票 0

WPF DataGrid 上下文菜单无需右键单击该行即可显示

WPF 应用程序有 2 种模式:基本模式和高级模式。 有一个数据网格,用户可以使用上下文菜单重新运行或删除当前项目。 此上下文菜单仅在高级模式为

回答 1 投票 0

无法找到图像 svg 资源

在 Visual Studio Community 2022 中构建我的代码时找不到某些图标。 但是,代码确实执行了,并且我仅在报告另一个错误时才看到这些错误。 构建

回答 1 投票 0

WPF DataGrid 自动调整大小问题

我最近一直在尝试在 WPF (C/4.0) DataGrid 中进行文本换行,无论我实现哪种解决方案(都在模板内使用某种形式的 TextBlock 进行换行),它都...

回答 2 投票 0

XamlParseException :: 找不到名为“DefaultStyle”的资源

我自定义了一个切换按钮以在控制框中使用。但当我将鼠标悬停在它上面时,它抛出了这个异常: System.Windows.Markup.XamlParseException:“在”System.Windows.Ma 上提供值...

回答 3 投票 0

如何在代码后面的两个数据模板之间切换

我有一个包含两个数据模板的资源字典。每个模板都有一个带有对象的堆栈面板。 根据我从其他地方获得的条件,在我的代码后面,我想嵌入其中之一

回答 1 投票 0

可重用控件和 DependencyProperty 的奇怪行为

我正在尝试制作一个可重复使用的控件的小型POC,但我遇到了奇怪的行为,看在上帝的份上,我无法弄清楚为什么。 所以我希望这里的任何人都能对此有所了解。 我是

回答 1 投票 0

内容控制阴影

我们有一个应用程序的设计规范,其中我们为每个对话框屏幕定义了一个标题。 标题控件通常添加到表格中的对话框窗口中,标题为...

回答 1 投票 0

对于源绑定到URL的图片,如何将显示的图片保存到磁盘上?

假设我有一个 Image,其 Source 来自绑定表达式,绑定到 URL(作为字符串): WPF 下载图像并显示它。 是

回答 1 投票 0

如何对列表框wpf应用分页

我想对包含1000条记录的列表框应用分页。

回答 2 投票 0

MSAGL:WpfGraphControl:单击后如何获取图形上的对象?

我正在使用 MVVM 在 WPF 上创建应用程序,我需要在鼠标单击图形后获取一个对象(节点、边),以用不同的方式处理它们。 但是当我点击图表时,我得到一个对象......

回答 1 投票 0

自定义窗口样式未显示在设计视图中

我正在尝试在VS2019(.NET Core 3.1)中的WPF应用程序中自定义窗口样式。我正在观看视频,当前将样式直接添加到 MainWindow.xaml 中。没有我的

回答 2 投票 0

请检查Msixvc支持服务是否安装

问题描述 我正在尝试为 .NET WPF 应用程序创建 MSXI 安装程序。我已成功发布 .appinstaller 文件,但单击安装程序时会显示下面的窗口。 可以...

回答 1 投票 0

WPF DataGrid - 验证建议

我们正在使用 MVVM 实现 WPF 业务应用程序。 目前,我们正在尝试确定显示 DataGrid 验证错误的最佳方式。 目前我们正在尝试这样做: ...

回答 2 投票 0

如何为 WPF TreeView 设置 DataTemplate 以显示列表的所有元素?

我想在 WPF 中使用 TreeView 可视化以下数据结构: 类 MyDataContext { ICollectionView 外部 {get;set;} //... } 类外层 { 字符串名称 {get;set;}

回答 3 投票 0

在Wpf中为ListView构建分页用户控件

我在 WPF 窗口中有一个 ListView。此 ListView 绑定到强类型列表。 我有10个这样的Windows。每个都有一个绑定到强类型列表的 Listview。 我有一个带有 4 个

回答 2 投票 0

ViewModel 中的 ObservableProperty 不会触发 WPF 中模型对象的 PropertyChanged

问题: 我正在开发一个 WPF 应用程序,使用 MVVM 模式和 CommunityToolkit.Mvvm 包来处理 ObservableProperty 和 INotifyPropertyChanged。但是,我遇到了一个问题

回答 1 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.