وبف:كيفية تصميم أو تعطيل قائمة السياق الافتراضية لـ TextBox
سؤال
من الواضح أنه عندما يقوم المستخدمون بالنقر بزر الماوس الأيمن فوق تطبيق WPF الخاص بنا، ويستخدمون سمة Windows Classic، فإن قائمة السياق الافتراضية لمربع النص (التي تحتوي على النسخ والقص واللصق) لها خلفية سوداء.
أعلم أن هذا يعمل جيدًا:
<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<TextBox ContextMenu="{x:Null}"/>
</Page>
لكن هذا لا يعمل:
<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Page.Resources>
<Style x:Key="{x:Type TextBox}" TargetType="{x:Type TextBox}">
<Setter Property="ContextMenu" Value="{x:Null}"/>
</Style>
</Page.Resources>
<TextBox/>
</Page>
هل يعرف أحد كيفية تصميم أو تعطيل قائمة السياق الافتراضية لجميع مربعات النص في WPF؟
المحلول 3
نظرًا لتقرير خطأ متأخر، اكتشفنا أنه لا يمكننا استخدام ApplicationComands Cut Paste and Copy مباشرة في تطبيق موثوق به جزئيًا.ولذلك، فإن استخدام هذه الأوامر في أي أمر من عناصر التحكم الخاصة بك لن يفعل شيئًا على الإطلاق عند تنفيذه.
لذا، في جوهر الأمر، كانت إجابة براد موجودة تقريبًا، ومن المؤكد أنها بدت بالطريقة الصحيحة، أي.لا توجد خلفية سوداء ولكن لم تحل المشكلة.
قررنا "إزالة" القائمة بناءً على إجابة براد، كما يلي:
<ContextMenu x:Key="TextBoxContextMenu" Width="0" Height="0" />
واستخدم قائمة السياق الفارغة هذه كما يلي:
<Style TargetType="{x:Type TextBox}">
<Setter Property="ContextMenu" Value="{StaticResource TextBoxContextMenu}" />
</Style>
نصائح أخرى
لتصميم قائمة السياق لجميع مربعات النص، سأفعل شيئًا مثل ما يلي:
أولاً، في قسم الموارد، قم بإضافة قائمة السياق التي تخطط لاستخدامها كقائمة سياق قياسية في مربع نص.
على سبيل المثال
<ContextMenu x:Key="TextBoxContextMenu" Background="White">
<MenuItem Command="ApplicationCommands.Copy" />
<MenuItem Command="ApplicationCommands.Cut" />
<MenuItem Command="ApplicationCommands.Paste" />
</ContextMenu>
ثانيًا، قم بإنشاء نمط لمربعات النص الخاصة بك، والذي يستخدم مورد قائمة السياق:
<Style TargetType="{x:Type TextBox}">
<Setter Property="ContextMenu" Value="{StaticResource TextBoxContextMenu}" />
</Style>
وأخيرا، استخدم مربع النص الخاص بك كالمعتاد:
<TextBox />
إذا كنت تريد بدلاً من ذلك تطبيق قائمة السياق هذه على بعض مربعات النص الخاصة بك فقط، فلا تقم بإنشاء النمط أعلاه، وأضف ما يلي إلى علامة TextBox الخاصة بك:
<TextBox ContextMenu="{StaticResource TextBoxContextMenu}" />
أتمنى أن يساعدك هذا!
غريب. ContextMenu="{x:Null}"
لا تفعل الخدعة.
لكن هذا يفعل:
<TextBox.ContextMenu>
<ContextMenu Visibility="Collapsed">
</ContextMenu>
</TextBox.ContextMenu>
حاول إزالة السمة x:Key من مورد النمط، مع ترك TargetType.أعلم أنه من المفترض أن يكون لديك x:Key لمورد ما، ولكن إذا كان لديك مع TargetType الخاص بك، فإن المفتاح هو الذي يسود.
فيما يلي نموذج للنمط الذي أستخدمه في مشروع لتنسيق جميع تلميحات الأدوات في أحد تطبيقاتي (هذا موجود في App.Resources--إشعار، بدون مفتاح)
<Style
TargetType="{x:Type ToolTip}">
<Setter
Property="Template">
<Setter.Value>
<ControlTemplate
TargetType="{x:Type ToolTip}">
<Grid
Width="{TemplateBinding Width}"
Height="{TemplateBinding Height}">
<Rectangle
RadiusX="9"
RadiusY="9"
Stroke="LightGray"
StrokeThickness="2">
<Rectangle.Fill>
<RadialGradientBrush>
<GradientStop />
<GradientStop
Color="FloralWhite"
Offset="0" />
<GradientStop
Color="Cornsilk"
Offset="2" />
</RadialGradientBrush>
</Rectangle.Fill>
</Rectangle>
<ContentPresenter
Margin="6 4 6 4" />
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
لا يهم، إذا لم تقم بتوفير مفتاح، فإنه سيتم استخدام TargetType
كمفتاح بنفس الطريقة التي يستخدمها المثال الخاص بي :)
مأخوذة من MSDN على النمط:
وضع
TargetType
الملكية إلىTextBlock
اكتب بدون تعيينx:Key
يحدد ضمناx:Key
ل{x:Type TextBlock}
.وهذا يعني أيضًا أنه إذا قمت > > بإعطاء النمط أعلاهx:Key
قيمة أي شيء آخر غير{x:Type TextBlock}
, ، لن يتم تطبيق النمط على جميع عناصر TextBlock تلقائيًا.بدلاً من ذلك ، تحتاج إلى تطبيق النمط علىTextBlock
العناصر صراحة
http://msdn.microsoft.com/en-us/library/system.windows.style.targettype.aspx
هذه هي الطريقة التي أستخدمها دائمًا:
<TextBox x:Name="MyTextbox">
<TextBox.ContextMenu>
<ContextMenu Visibility="Hidden"/>
</TextBox.ContextMenu>
</TextBox>
ويمكن أيضًا استخدام:
MyTextbox.ContextMenu.Visibility = Visibility.Hidden;
MyTextbox.ContextMenu.Visibility = Visibility.Visble;