Windows Presentation Foundation或WPF是用于在基于Windows的应用程序中呈现用户界面的子系统。
TextBlock 中的 C# 超链接:单击它时没有任何反应
在我的 C# 独立应用程序中,我想让用户单击一个链接来启动他们最喜欢的浏览器。 System.Windows.Controls.TextBlock 文本 = new TextBlock(); Run run = new Run("链接 Tex...
在选项卡式界面应用程序中,我尝试将 TabItem 标头字符串或所选 TabItem 中包含的对象传递到视图模型以使用它 发布这样的事件: 在 Vi...
C#/WPF:使 GridViewColumn 可见 = false?
有谁知道是否有一个选项可以像这样隐藏 GridViewColumn: 有谁知道是否有一个选项可以像这样隐藏 GridViewColumn : <ListView.View> <GridView> <GridViewColumn Header="Test" IsVisible="{Binding Path=ColumnIsVisible}" /> </GridView> <ListView.View> 非常感谢! 编辑:为了清楚起见 不幸的是,没有“IsVisible”属性。我正在寻找一种方法来创建它。 编辑:基于反馈的解决方案如下所示: <GridViewColumn DisplayMemberBinding="{Binding Path=OptionColumn1Text}" Width="{Binding Path=SelectedEntitiy.OptionColumn1Width}"> <GridViewColumnHeader Content="{Binding Path=SelectedEntitiy.OptionColumn1Header}" IsEnabled="{Binding Path=SelectedEntitiy.OptionColumn1Width, Converter={StaticResource widthToBool}}" /> </GridViewColumn> public class WidthToBooleanConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { return (int)value > 0; } public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { throw new NotImplementedException(); } } 谢谢大家! 干杯 编辑:反映修改后的问题。 创建一个 0 宽度的列怎么样?编写一个布尔值到宽度 IValueConverter,它采用 ColumnIsVisible 作为 ConverterParmeter? public class BooleanToWidthConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, CultureInfo culture){ return ((bool) parameter)? value : 0; } public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture){ throw new NotImplementedException(); } } 类似: <ListView .. > <ListView.Resources> <BooleanToWidthConverter x:Key="boolToWidth" /> </ListView.Resources> <ListView.View> <GridView> <GridViewColumn Header="Test" Width= "{Binding Path=ColumnWidth, Converter={StaticResource boolToWidth}, ConverterParameter=ColumnIsVisible}" /> </GridView> <ListView.View> 这里是另一种基于将列宽度设置为零的解决方案。我稍微修改了一下。现在它的工作原理如下: 使用布尔到可见性转换器将标头的可见性绑定到 ViewModel 的布尔属性 使用标题上的附加属性将列的宽度设置为零 这是代码。 XAML: <GridViewColumn HeaderTemplate="..." HeaderContainerStyle="..."> <GridViewColumnHeader Content="Header text" Visibility="{Binding AppliesToColumnVisible, Converter={StaticResource BooleanToVisibilityConverter}}" behaviors:GridViewBehaviors.CollapseableColumn="True" /> 布尔到可见性转换器: public class BooleanToVisibilityConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { bool param = bool.Parse(value.ToString()); if (param == true) return Visibility.Visible; else return Visibility.Collapsed; } public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { throw new NotImplementedException(); } } 附加行为GridViewBehaviors.CollapseableColumn: public static readonly DependencyProperty CollapseableColumnProperty = DependencyProperty.RegisterAttached("CollapseableColumn", typeof(bool), typeof(GridViewBehaviors), new UIPropertyMetadata(false, OnCollapseableColumnChanged)); public static bool GetCollapseableColumn(DependencyObject d) { return (bool)d.GetValue(CollapseableColumnProperty); } public static void SetCollapseableColumn(DependencyObject d, bool value) { d.SetValue(CollapseableColumnProperty, value); } private static void OnCollapseableColumnChanged(DependencyObject sender, DependencyPropertyChangedEventArgs args) { GridViewColumnHeader header = sender as GridViewColumnHeader; if (header == null) return; header.IsVisibleChanged += new DependencyPropertyChangedEventHandler(AdjustWidth); } static void AdjustWidth(object sender, DependencyPropertyChangedEventArgs e) { GridViewColumnHeader header = sender as GridViewColumnHeader; if (header == null) return; if (header.Visibility == Visibility.Collapsed) header.Column.Width = 0; else header.Column.Width = double.NaN; // "Auto" } 您可以通过编程方式删除它: 如果您知道标题的名称: RemoveHeaderByName(listView, "Your Header Name"); private bool RemoveHeaderByName(ListView listView, string headerName) { GridView gridView = listView?.View as GridView; if (gridView != null) { foreach(var column in gridView?.Columns) { if (column.Header as string == headerName) { if(gridView.Columns.Remove(column)) return true; } } return false; } } 或者,如果您知道标头的索引(如果可以更改标头名称,例如,如果您有本地化应用程序,那就更好了): private bool RemoveHeaderByPosition(ListView listView, int position) { GridView gridView = listView?.View as GridView; if (gridView != null && position >= gridView.Columns.Count-1) { var columnToRemove = gridView.Columns[position]; if (gridView.Columns.Remove(columnToRemove)) return true; } return false; } 一种更简单的方法,仍然使用将列宽度设置为零的概念,但没有使用 IValueConverter 的副作用(用户仍然可以将列拖得更宽),它是创建一个新的 getter/setter 来返回基于您的 ColumnIsVisible 变量的宽度,然后绑定到该变量: public double ColumnWidth { get { if (this.ColumnIsVisible) { return 100; } else { return 0; } } set { OnPropertyChanged("ColumnWidth"); } } 使您的绑定为双向,如果用户尝试将列拖得更宽,将调用OnPropertyChanged并将宽度重置为0。不过,您可能必须使用绑定代理来进行绑定。当 ColumnIsVisible 更新时,还添加对 OnPropertyChanged("ColumnWidth") 的调用:) 我已将该列设置为 width="0"。 现在该列看起来不可见。但不知道会不会影响其他什么。 这可能是一个虚拟的解决方案,但目前它有效。 我选择通过在创建一个新的类来保存GridView的状态,然后在状态发生改变的时候手动更新列表的状态,相当于不可见的时候移除,而不是隐藏他 foreach (var item in ListViewVisibilitys.Where(x => x.IsVisibility==false).ToList()) { gridView.Columns.Remove(item.gridViewColumn); } var lists = ListViewVisibilitys.Where(x => x.IsVisibility == true).ToList(); for (int i = 0; i < lists.Count; i++) { var desiredColumn = lists[i].gridViewColumn; if (gridView.Columns.Contains(desiredColumn)) { var actualIndex = gridView.Columns.IndexOf(desiredColumn); // 如果当前列的位置不正确,则将其移动到正确的位置 if (actualIndex != i) { gridView.Columns.Move(actualIndex, i); } } else { gridView.Columns.Insert(i, desiredColumn); } } 如果 Thumb.DragDelta 可以解决问题,请使用 我在列表视图中使用它作为 <ListView x:Name="MyListView"IsSynchronizedWithCurrentItem="True" ItemsSource="{Binding Path=Items}", Mode=Default, Source={StaticResource DataProvider}}" Thumb.DragDelta="Thumb_DragDelta"> public Window1() { InitializeComponent(); MyListView.AddHandler(Thumb.DragDeltaEvent, new DragDeltaEventHandler(Thumb_DragDelta), true ); void Thumb_DragDelta(object sender, DragDeltaEventArgs e) { Thumb senderAsThumb = e.OriginalSource as Thumb; GridViewColumnHeader header = senderAsThumb.TemplatedParent as GridViewColumnHeader; if (header.Column.ActualWidth < MIN_WIDTH) { header.Column.Width = MIN_WIDTH; } if (header.Column.ActualWidth > MAX_WIDTH) { header.Column.Width = MAX_WIDTH; } } }
我在asm中过滤图像,并使用WPF C#作为GUI。当我有过滤数据并且想将其转换为位图时,我在这行 Marshal.Copy(imageBytesPtr, imageBytes, 0, imageWi...
MVVM、XAML、C# - DependencyProperty - ItemsControl 中的 ObservableCollection 无法识别 Property
我对 MVVM 和 c# 系统相当陌生,只是将其用作一个小小的业余爱好。在过去的三天里,我一直对以下问题感到绝望。 我有一个带有相应的自定义控件视图...
出于某种原因,我根本无法让它工作。我从各种来源了解到,我可以在 WPF 应用程序中重写 OnStartup,并且它会在创建应用程序时触发。不过,没关系...
Telerik RadMenuItem AutomationId
我正在尝试使用下面的代码为 telerik RadMenuItem 设置自动化 id,但当我使用检查工具时,我看不到附加到元素的自动化 id。我正在使用 Telerik 2008 架构和
当我将鼠标悬停在 1 个按钮上时,我希望在 WPF 中更改另一个按钮的不透明度
我想将鼠标悬停在 1 个按钮上,然后另一个按钮的不透明度缓慢变化(淡出),在 XAML 代码中使用 WPF (C#) 中的动画。 我想要更改的按钮有 x:Name=”
我在网格内有一个菜单,尽管我已将边框厚度和画笔设置为相同的颜色并且为空,但我以某种方式看到右侧白色边框,不确定它来自哪里 我有一个例子...
使用MVVM工具包连接两个属性(NotifyPropertyChangedFor)
我有一个关于 C# 新 MVVM 工具包的问题, 我想知道为什么这段代码有效; 字符串 MyProp => inputSystemName; [可观察属性] [NotifyPropertyChangedFor(nameof(MyP...
我用 ControlTemplate 制作了一个自定义组合框, 到目前为止,我对布局非常满意,但问题是绑定到大型集合时弹出窗口的性能, 总结一下...
我有一个 WPF 组合框,当我键入该字母时,我想转到组合框中以(例如)“e”开头的项目。如何? 我的 XAML 代码: 我有一个 WPF ComboBox,当我键入该字母时,我想转到 ComboBox 中以(例如)“e”开头的项目。怎么办? 我的XAML代码: <ComboBox ItemsSource="{Binding Roles}" SelectedValuePath="Id" ItemTemplate="{StaticResource ComboBoxDisplayName}" SelectedItem="{Binding SelectedRole}" Width="150"/> 编辑:我猜你有一个ItemTemplate,看起来有点像这样: <StackPanel> <TextBlock Text="{Binding Path=Foo}" /> <TextBlock Text="{Binding Path=Bar}" /> </StackPanel> 如果您想搜索 Foo,请尝试... <ComboBox IsEditable = "True" TextSearch.TextPath = "Foo" /> 默认情况下,ComboBox有一种自动完成功能,可以根据第一个字母查找匹配项 - 假设您的源按字母顺序排序,这会将所选项目移动到(例如)以“e”开头的部分。 如果您希望有多个以同一字母开头的条目,则捕获 KeyDown 强制打开下拉菜单可能会很有用。 假设您的项目按字母顺序排序,只需设置 IsTextSearchEnabled="True" 即可跳转到以您在 ComboBox 中输入的字母(或多个字母)开头的项目。 这是我的 ComboBox 之一的示例,我简化了绑定,因为它显然不是这里的重要部分... <ComboBox ItemsSource="{Binding MyObjectList}" DisplayMemberPath="Description" SelectedValuePath="Code" IsTextSearchEnabled="True"/> 这非常适合从列表中选择一个值,但是,您键入的搜索值不会显示在控件的 TextBox 部分中,因为我将 IsEditable 设置为 false。 如果有人想解释为什么这被否决,我将不胜感激,我不认为我提供的答案有任何问题,也不明白为什么当我只是想这样做时我应该失去声誉帮助(并提供了合理的答案!) 我所要做的就是添加以下内容: TextSearch.TextPath="<what ever you bound to goes here> ie:State or name " 我知道这是一篇旧帖子,但这可能会对某人有所帮助。 如果您正在使用绑定(您应该这样做)以及 ItemSource 和 SelectedItem,那么只需添加 TextSearch.TextPath="您的绑定显示属性" 正如@mwolff 所述即可正常工作。 <ComboBox Grid.Row="2" Grid.Column="0" Height="25" VerticalContentAlignment="Center" HorizontalAlignment="Center" Width="150" ItemsSource="{Binding EquipmentTypes, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" SelectedItem="{Binding SelectedEquipmentType,Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" SelectedValuePath="Equipment_Type_ID" TextSearch.TextPath="Equipment_Type_Code" ScrollViewer.HorizontalScrollBarVisibility="Disabled"> <ComboBox.Resources> <Style TargetType="Popup"> <Setter Property="Width" Value="155"/> </Style> </ComboBox.Resources> <ComboBox.ItemTemplate> <DataTemplate> <TextBlock Text="{Binding Equipment_Type_Code}" TextWrapping="NoWrap" /> </DataTemplate> </ComboBox.ItemTemplate>
在一次 WPF 面试中,我被要求创建一个简单的联系人管理 WPF 应用程序。该应用程序是一个 2 窗格联系人管理应用程序,左侧窗格显示联系人列表...
在我的应用程序中,我有在多个类中使用的各种样式和模板。我已经在 my 中定义了这些,以便它们从所有子对象中可见。 然而,在设计时,WPF de...
如何调用CommunityToolkit.MVVM中[ObservableProperty]的Setter属性中的方法?
我在 MainViewModel 中使用 CommunityToolkit.MVVM 来减少样板代码。但是,我在调用 [ObservableProperty] 的 setter 属性中的方法时遇到问题。 以前,是...
我正在尝试禁用 wpf 窗口中的最大化容量(不是最大化按钮),但到目前为止没有成功。 我正在使用 WindowStyle="none" 的窗口,但是当我将窗口拖动到...
我们的图形人员使用 Adobe Illustrator,我们希望在 WPF 应用程序中使用她的图像作为路径。有办法做到这一点吗?
我一直在尝试修改一个具有日志记录窗口的应用程序,该窗口当前仅在用户使用鼠标滚轮手动滚动时才会滚动。我希望窗口在...时向下滚动
我对此失去了理智。我正在为 powershell 脚本构建 UI。组合框的 xaml: 我对此失去了理智。我正在为 powershell 脚本构建 UI。组合框的 xaml: <ComboBox x:Name="CB_Failover" Width="172" Margin="5,5,0,0" IsReadOnly="True"> <ComboBoxItem x:Name="CBI_CBFailover_ALL" Content="All"/> <ComboBoxItem x:Name="CBI_CBFailover_core" Content="Core"/> <ComboBoxItem x:Name="CBI_CBFailover_wave1" Content="Wave 1"/> <ComboBoxItem x:Name="CBI_CBFailover_wave2" Content="Wave 2"/> <ComboBoxItem x:Name="CBI_CBFailover_wave3" Content="Wave 3"/> </ComboBox> 一旦我运行 $synchash.window.showdialog() ,这些项目就会在 UI 中完美显示。但是,当我尝试访问它的控件时,使其有用。这就是我所看到的。 $synchash.cb_failover ShouldPreserveUserEnteredPrefix : IsEditable : Text : IsReadOnly : SelectionBoxItem : SelectionBoxItemTemplate : SelectionBoxItemStringFormat : StaysOpenOnEdit : IsSelectionBoxHighlighted : IsSynchronizedWithCurrentItem : SelectedIndex : SelectedItem : SelectedValue : SelectedValuePath : Items : {, , , …} etc... items 属性显示那里有项目,但不知何故它们都是空的。它是一个什么都没有的数组。如果我深入了解项目($synchash.CB_Failover.items),名称和内容的属性为空。我不知道组合框从哪里获取用户界面的信息。如果没有控制。但用户界面显示每个组合框项目的“内容”。我不想太冗长并展示我的整个脚本,因为它很多。我希望组合框中只有一些愚蠢的属性需要添加。 提前致谢。 编辑: 仍然没有弄清楚问题 - 但它是由线程引起的。 我的脚本的开头在新的运行空间中启动它。 $global:syncHash = [hashtable]::Synchronized(@{}) $syncHash.Host = $host; $newRunspace =[runspacefactory]::CreateRunspace() $newRunspace.ApartmentState = "STA" $newRunspace.ThreadOptions = "ReuseThread" $newRunspace.Open() $newRunspace.SessionStateProxy.SetVariable("syncHash",$syncHash) $psCmd = [PowerShell]::Create().AddScript({ Add-Type -AssemblyName PresentationFramework $xamlFile = "a personal and private path that holds many secrets" $inputXML = Get-Content $xamlFile -Raw $inputXML = $inputXML -replace 'mc:Ignorable="d"', '' -replace "x:N", 'N' -replace '^<Win.*', '<Window' [xml]$XAML = $inputXML 这就是关键点。如果我通过线程执行此操作,控件就会通过,但内容不会。无论我自动还是手动构建所有变量 - 都没关系。 $synchash 将带来控制权,但不会带来其内容。 $reader=(New-Object System.Xml.XmlNodeReader $xaml) $syncHash.Window=[Windows.Markup.XamlReader]::Load( $reader ) #$xaml.SelectNodes("//*[@*[contains(translate(name(.),'n','N'),'Name')]]") | % { # $syncHash.Add($_.Name, $syncHash.Window.FindName($_.name)) #} $syncHash.Add('CB_Failover', $syncHash.Window.FindName('cb_failover')) 但是,如果我不创建新的运行空间,而只是在全局范围内运行它,则组合框项目的内容不会出现问题。 $xamlFile = "A personal and private path" $inputXML = Get-Content $xamlFile -Raw $inputXML = $inputXML -replace 'mc:Ignorable="d"', '' -replace "x:N", 'N' -replace '^<Win.*', '<Window' [xml]$XAML = $inputXML $global:var_CB_Failover = $global:window.FindName('CB_Failover') 输出: >$global:var_cb_failover.items.content All Core etc... 那么为什么不同的线程能够拉取控件,但不能拉取该控件内的内容。但是,也能够提取该内容并将其显示在 UI 中吗? 所以在深入研究之后 - 抱歉,对这一切真的很陌生。找到一篇多年前写的文章,其中有 boe prox 的解决方案 https://learn-powershell.net/2012/10/14/powershell-and-wpf-writing-data-to-a-ui-from-a- Different-runspace/ TLDR; 内容就在那里,但除非使用调度程序,否则无法从另一个线程中提取它。就我而言,这有效。 $syncHash.CB_Failover.Dispatcher.Invoke([action]{$global:return = $syncHash.CB_Failover.items | select -Expand content}) | out-null 输出: > $return All Core etc... 这真的很令人困惑,因为肯定有很多其他控件、内容等我可以在不使用调度程序的情况下访问。
我有一个“打开项目”按钮,单击该按钮会打开一个文件对话框并允许用户选择一个文件。我添加了一个命令,以便用户还可以使用“Ctrl + O”来选择文件......