هل من الممكن استخدام MENUITEM قابلة للتحديد كقالب الرقابة على زر راديو؟
-
19-08-2019 - |
سؤال
ولدي قائمة في طلبي WPF مع خيارات متعددة والتي تعمل مثل مجموعة زر الاختيار (اختيار واحد يتم إزالة بقية منهم). وأود أن استخدام عناصر القائمة قابلة للتحديد كقوالب لأزرار الراديو.
ولقد حاولت تعيين القالب ولكن لا يبدو للعمل مثل واحد تتوقع. لا يبدو اختيار وإلغاء تحديد العناصر المراد تزامنها مع القيم أزرار الراديو ".
واعتقد انني يمكن استخدام قالب أكثر تعقيدا و"وهمية" علامة المحدد باستخدام مسار أو شيء من هذا ولكن يبدو الكثير بفظاعة العمل لهذا الغرض بسيط. أيضا عند استخدام قالب أكثر تعقيدا كنت قد لمعالجة الموضوعات المختلفة التي كنت تفضل عدم تريد القيام به.
وهنا مثال بسيط لتوضيح المشكلة.
<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Page.Resources>
<ControlTemplate x:Key="Template" TargetType="{x:Type RadioButton}">
<MenuItem x:Name="item" Header="{TemplateBinding Content}" IsCheckable="True" IsChecked="False" />
<ControlTemplate.Triggers>
<Trigger Property="IsChecked" Value="True">
<Setter TargetName="item" Property="IsChecked" Value="True" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Page.Resources>
<StackPanel>
<RadioButton Content="Foo" Template="{StaticResource Template}"/>
<RadioButton Content="Bar" Template="{StaticResource Template}"/>
<RadioButton Content="Biz" Template="{StaticResource Template}"/>
</StackPanel>
</Page>
المحلول
والمشكلة أظهرت أن معالجات الأحداث الماوس MenuItem
انه تم الاستيلاء على لRadioButton
. عندما أضع IsHitTestVisible
على MenuItem
إلى كاذبة وأضاف Border
لامتصاص أحداث الماوس، على ما يبدو للعمل كما هو متوقع:
<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Page.Resources>
<ControlTemplate x:Key="Template" TargetType="{x:Type RadioButton}">
<Border Background="Transparent">
<MenuItem Header="{TemplateBinding Content}" IsCheckable="False" IsChecked="{TemplateBinding IsChecked}" IsHitTestVisible="False"/>
</Border>
</ControlTemplate>
</Page.Resources>
<StackPanel>
<RadioButton Content="Foo" IsChecked="True" Template="{StaticResource Template}"/>
<RadioButton Content="Bar" Template="{StaticResource Template}"/>
<RadioButton Content="Biz" Template="{StaticResource Template}"/>
</StackPanel>
</Page>