如何为APRadioButtonListBox控件条件移除换行布局(排除指定窗口)
解决单选按钮列表全局换行、单个窗口例外的问题
我之前也碰到过类似的场景——给全局控件统一加样式,却总有一两个特殊情况要例外。这里给你几个实用的思路,按需选择就行:
方案一:直接在例外控件上覆盖属性
如果只有单个控件需要例外,这是最直接的方式,不用改全局样式也不用额外写代码,直接在目标控件上手动设置要覆盖的属性,怼掉全局样式的配置:
<auc:APRadioButtonListBox ScrollViewer.HorizontalScrollBarVisibility="Auto"> <auc:APRadioButtonListBox.ItemsPanel> <ItemsPanelTemplate> <!-- 换成你需要的不换行面板,比如横向StackPanel --> <StackPanel Orientation="Horizontal" /> </ItemsPanelTemplate> </auc:APRadioButtonListBox.ItemsPanel> </auc:APRadioButtonListBox>
方案二:用附加属性做全局条件判断
如果以后可能有更多控件需要例外,或者想把「是否禁用换行」做成可配置标记,可以搞个附加属性,在全局样式里加触发器判断:
第一步:定义附加属性
在项目里添加一个辅助类:
public static class RadioButtonListBoxHelper { public static readonly DependencyProperty IsWrapDisabledProperty = DependencyProperty.RegisterAttached( "IsWrapDisabled", typeof(bool), typeof(RadioButtonListBoxHelper), new PropertyMetadata(false)); public static void SetIsWrapDisabled(DependencyObject element, bool value) { element.SetValue(IsWrapDisabledProperty, value); } public static bool GetIsWrapDisabled(DependencyObject element) { return (bool)element.GetValue(IsWrapDisabledProperty); } }
第二步:修改全局样式
在原全局样式里添加DataTrigger,根据附加属性的值切换布局:
<Style TargetType="auc:APRadioButtonListBox"> <!-- 默认的换行配置 --> <Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Disabled" /> <Setter Property="ItemsPanel"> <Setter.Value> <ItemsPanelTemplate> <WrapPanel Orientation="Horizontal" /> </ItemsPanelTemplate> </Setter.Value> </Setter> <!-- 当标记禁用换行时,重置属性 --> <Style.Triggers> <DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Path=(local:RadioButtonListBoxHelper.IsWrapDisabled)}" Value="True"> <Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Auto" /> <Setter Property="ItemsPanel"> <Setter.Value> <ItemsPanelTemplate> <StackPanel Orientation="Horizontal" /> </ItemsPanelTemplate> </Setter.Value> </Setter> </DataTrigger> </Style.Triggers> </Style>
第三步:标记例外控件
之后只要在不需要换行的控件上加上这个标记即可:
<auc:APRadioButtonListBox local:RadioButtonListBoxHelper.IsWrapDisabled="True" />
方案三:给例外窗口单独写样式
如果整个窗口里的APRadioButtonListBox都不需要换行,可以在窗口的Resources里写个本地样式,基于全局样式但覆盖需要修改的属性:
<Window ...> <Window.Resources> <Style TargetType="auc:APRadioButtonListBox" BasedOn="{StaticResource {x:Type auc:APRadioButtonListBox}}"> <Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Auto" /> <Setter Property="ItemsPanel"> <Setter.Value> <ItemsPanelTemplate> <StackPanel Orientation="Horizontal" /> </ItemsPanelTemplate> </Setter.Value> </Setter> </Style> </Window.Resources> <!-- 窗口内所有APRadioButtonListBox都会自动使用这个本地样式 --> </Window>
这三个方案各有侧重:单个控件例外选方案一,多个例外选方案二,整个窗口例外选方案三,你根据实际场景挑就行。
内容的提问来源于stack exchange,提问作者renaldogg
相关产品推荐
相关产品推荐

