ComboBoxWatermarkBehavior我目前有一个绑定到字典的combobox。我想要做的是在组合框中有一个默认项,例如“请选择一个项目...”,当用户实际单击组合框以选择该项目时,该项目就会消失。我在这个网站上看到过类似的问题,但似乎无法找到任何适合我的解决方案。我唯一的幸运是把它放在我的xamlcombobox代码中:但是当然这会改变组合框的外观,我不希望它看起来可编辑。我背后的代码:privateDictionaryimageTypes=newDictionary();publicMainWindow(){InitializeComponent();AddImage_Types();}publicvoidAddImage_Types(){imageTypes.Add("*.png",Png);imageTypes.Add("*.jpg*.jpeg*jfif",Jpg);}publicDictionaryImageTypes{get{returnimageTypes;这是我的组合框的xaml:我尝试使用像这样的答案的触发器和样式:https://stackoverflow.com/a/16782339/2480598我确信这很简单,但我似乎无法理解.注意:默认情况下,我的意思是当窗口加载时,一些文本已经显示在组合框中,例如“请选择一个项目...”。当用户单击组合框以从下拉列表中选择一个项目时,这将消失。你想要的方式不是WPF的工作方式。做到这一点的最好方法是使用数据验证/绑定,这样用户在选择某些东西之前不能继续前进;如果用户没有选择某些东西,或者甚至只是在那里给出默认值,则抛出验证错误(组合框周围的红线)。但是,如果您希望它按您要求的方式工作,您可以:a)在您的字典中包含“请选择一个项目...”,然后让事件处理程序在用户选择其他内容时将其删除b)将“请选择项目...”作为绑定字典中的唯一项目,然后让事件处理程序在用户打开组合框时更改绑定c)在组合框顶部放置一个标签,透明背景在单击时消失d)(未经测试),如何调整此链接中的代码?:第一项另一项查看此TextBox示例。您可以对ComboBox执行相同的操作:WatermarkBehavior1-添加对程序集System.Windows.Interactivity的引用2-在您的xamlxmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"3-将此类添加到您的项目中publicstringText{get{return(string)GetValue(TextProperty);}set{SetValue(TextProperty,value);}}//使用DependencyProperty作为Text的后备存储。这会启用动画、样式、绑定等...publicstaticreadonlyDependencyPropertyTextProperty=DependencyProperty。Register("Text",typeof(string),typeof(WatermarkBehavior),newPropertyMetadata("Watermark"));publicdoubleFontSize{get{return(double)GetValue(FontSizeProperty);}set{SetValue(FontSizeProperty,value);}}//使用DependencyProperty作为FontSize的后备存储。这会启用动画、样式、绑定等...publicstaticreadonlyDependencyPropertyFontSizeProperty=DependencyProperty.Register("FontSize",typeof(double),typeof(WatermarkBehavior),newPropertyMetadata(12.0));publicBrushForeground{get{return(Brush)GetValue(ForegroundProperty);}set{SetValue(ForegroundProperty,value);}}//使用DependencyProperty作为前景的后备存储。这会启用动画、样式、绑定等...publicstringFontFamily{get{return(string)GetValue(FontFamilyProperty);}set{SetValue(FontFamilyProperty,value);}}//使用DependencyProperty作为FontFamily的后备存储。这会启用动画、样式、绑定等......));protectedoverridevoidOnAttached(){adorner=newWaterMarkAdorner(this.AssociatedObject,this.Text,this.FontSize,this.FontFamily,this.Foreground);this.AssociatedObject.Loaded+=this.OnLoaded;this.AssociatedObject.GotFocus+=this.OnFocus;this.AssociatedObject.LostFocus+=this.OnLostFocus;}privatevoidOnLoaded(objectsender,RoutedEventArgse){if(!this.AssociatedObject.IsFocused){if(String.IsNullOrEmpty(this.AssociatedObject.Text)){varlayer=AdornerLayer.GetAdornerLayer(this.AssociatedObject);层。添加(装饰器);}}}privatevoidOnLostFocus(objectsender,RoutedEventArgse){if(String.IsNullOrEmpty(this.AssociatedObject.Text)){try{varlayer=AdornerLayer.GetAdornerLayer(this.AssociatedObject);层。添加(装饰器);}catch{}}}privatevoidOnFocus(objectsender,RoutedEventArgse){varlayer=AdornerLayer.GetAdornerLayer(this.AssociatedObject);layer.Remove(装饰器);}受保护的覆盖voidOnDetaching(){base.OnDetaching();}publicclassWaterMarkAdorner:Adorner{私有字符串文本;私有双字体大小;私有字符串字体系列;私刷前景;publicWaterMarkAdorner(UIElementelement,stringtext,doublefontsize,string:font,foreground)base(element){this.IsHitTestVisible=false;this.Opacity=0.6;this.text=文本;this.fontSize=字体大小;this.fontFamily=字体;this.foreground=前景;}protectedoverridevoidOnRender(System.Windows.Media.DrawingContextdrawingContext){base.OnRender(drawingContext);vartext=newFormattedText(this.text,System.Globalization.CultureInfo.CurrentCulture,System.Windows.FlowDirection.LeftToRight,newSystem.Windows.Media.Typeface(fontFamily),fontSize,前景);drawingContext.DrawText(文本,新点(3,3));}}}4-并添加您的ComboBox:Item1Item2Item3好的,这是我的版本,与Anime提供的版本几乎相同相同版本我做了一些更改:添加了Margin依赖属性,以便能够将水印定位在我需要的位置。完全限定了一些对象,因为我的VS感到困惑,并用另一个覆盖替换了一个不推荐使用的方法。我还更改了OnFocus事件处理程序,因此当控件获得焦点时文本实际上消失了。可能不通用,但适用于我的场景。来了:以上就是C#学习教程:ComboBox的水印行为分享的全部内容。如果对大家有用,需要进一步了解C#学习教程,希望大家多多关注——publicclassWatermarkBehavior:Behavior{privateWaterMarkAdorneradorner;publicstringText{get{return(string)GetValue(TextProperty);}set{SetValue(TextProperty,value);}}publicstaticreadonlyDependencyPropertyTextProperty=DependencyProperty。Register("Text",typeof(string),typeof(WatermarkBehavior),newPropertyMetadata("Watermark"));publicdoubleFontSize{get{return(double)GetValue(FontSizeProperty);}set{SetValue(FontSizeProperty,value);}}publicstaticreadonlyDependencyPropertyFontSizeProperty=DependencyPropertynt.Register("Fo,typeof(double),typeof(WatermarkBehavior),newPropertyMetadata(12.0));publicSystem.Windows.Media.BrushForeground{get{return(System.Windows.Media.Brush)GetValue(ForegroundProperty);}set{SetValue(ForegroundProperty,value);}}publicstaticreadonlyDependencyPropertyForegroundProperty=DependencyProperty.Register("前景",typeof(System.Windows.Media.Brush),typeof(WatermarkBehavior),newPropertyMetadata(System.Windows.Media.Brushes.Black));publicstringFontFamily{get{return(string)GetValue(FontFamilyProperty);}set{SetValue(FontFamilyProperty,value);}}publicstaticreadonlyDependencyPropertyFontFamilyProperty=DependencyProperty.Register("FontFamily",typeof(string),typeof(WatermarkBehavior),newPropertyMetadata("SegoeUI"));publicThicknessMargin{get{return(Thickness)GetValue(MarginProperty);}set{SetValue(MarginProperty,value);}}publicstaticreadonlyDependencyPropertyMarginProperty=DependencyProperty.Register("Margin",typeof(Thickness),typeof(WatermarkBehavior));protectedoverridevoidOnAttached(){adorner=newWaterMarkAdorner(this.AssociatedObject,this.Text,this.FontSize,this.FontFamily,this.Margin,this.Foreground);this.AssociatedObject.Loaded+=this.OnLoaded;你s.AssociatedObject.GotFocus+=this.OnFocus;this.AssociatedObject.LostFocus+=this.OnLostFocus;}privatevoidOnLoaded(objectsender,RoutedEventArgse){if(!this.AssociatedObject.IsFocused){if(String.IsNullOrEmpty(this.AssociatedObject.Text)){varlayer=AdornerLayer.GetAdornerLayer(this.AssociatedObject);层。添加(装饰器);}}}privatevoidOnLostFocus(objectsender,RoutedEventArgse){if(String.IsNullOrEmpty(this.AssociatedObject.Text)){try{varlayer=AdornerLayer.GetAdornerLayer(this.AssociatedObject);层。添加(装饰器);}catch{}}}privatevoidOnFocus(objectsender,RoutedEventArgse){if(AssociatedObject.SelectedItem!=null){varlayer=AdornerLayer.GetAdornerLayer(this.AssociatedObject);layer.Remove(装饰器);}}protectedoverridevoidOnDetaching(){base.OnDetaching();}publicclassWaterMarkAdorner:Adorner{私有字符串文本;私有双字体大小;私有字符串字体系列;私有系统.Windows.Media.Brush前景;公共WaterMarkAdorner(UIElement元素,字符串文本,双字体大小,字符串字体,厚度边距,System.Windows.Media.Brush前景):基础(元素){this.IsHitTestVisible=false;this.Opacity=0.6;this.text=文本;this.fontSize=字体大小;this.fontFamily=字体;this.foreground=前景;this.Margin=保证金;}protectedoverridevoidOnRender(System.Windows.Media.DrawingContextdrawingContext){base.OnRender(绘图上下文);矩阵m=PresentationSource.FromVisual(Application.Current.MainWindow).CompositionTarget.TransformToDevice;vartext=newFormattedText(this.text,System.Globalization.CultureInfo.CurrentCulture,System.Windows.FlowDirection.LeftToRight,newTypeface(fontFamily),fontSize,前景,m.M11);drawingContext.DrawText(文本,newSystem.Windows.Point(3,3));}}}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
