2016-04-26 21 views
2

私はアプリケーションを作成していますが、すべてのロジックがありますが、フロントエンドの観点からはあまりよく知られていません。app.xamlでテキストボックスのプロパティをグローバルに設定する方法[C#]

私はどのようにすべてのボタンのデザインをグローバルに設定できるかを学びました。同じように私はテキストボックスをしようとしていた。確かにスタイルが適用されますが、このスタイルが適用された後にテキストボックスにテキストを挿入することはできません。 どうすれば修正できますか?何が問題ですか ?誰かが私に何が間違っていると教えてもらえますか

私がやりたかったことは、誰かがマウスでマウスを動かしている間に、すべてのテキストボックスとボタンの周りに薄い赤い枠線を作ることでした。そして私は同じスタイルでも提供したいコンボボックスが1つあります。

これは、App.xamlで私のコードです:

<Application x:Class="Application.App" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:local="clr-namespace:Application" 
      StartupUri="MainWindow.xaml"> 
    <Application.Resources> 

     <Style TargetType="Button"> 
      <Setter Property="OverridesDefaultStyle" Value="True"/> 
      <Setter Property="Template"> 
       <Setter.Value> 
        <ControlTemplate TargetType="Button"> 
         <Border Name="border" 
          CornerRadius="2" 
          BorderThickness="2" 
          BorderBrush="{TemplateBinding BorderBrush}" 
          Background="{TemplateBinding Background}"> 
          <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" /> 
         </Border> 
         <ControlTemplate.Triggers> 
          <Trigger Property="IsMouseOver" Value="True"> 
           <Setter TargetName="border" Property="BorderBrush" Value="#FF0000" /> 
          </Trigger> 
         </ControlTemplate.Triggers> 
        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
     </Style> 

     <Style TargetType="TextBox"> 
      <Setter Property="OverridesDefaultStyle" Value="True"/> 
      <!--<Setter Property="Foreground" Value="#000000"/>--> 
      <Setter Property="Template"> 
       <Setter.Value> 
        <ControlTemplate TargetType="TextBox"> 
         <Border Name="textbox" 
          CornerRadius="2" 
          BorderThickness="2" 
          BorderBrush="{TemplateBinding BorderBrush}" 
          Background="{TemplateBinding Background}"> 
          <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" /> 
         </Border> 
         <ControlTemplate.Triggers> 
          <Trigger Property="IsMouseOver" Value="True"> 
           <Setter TargetName="textbox" Property="BorderBrush" Value="#FF0000" /> 
           <!--<Setter Property="Foreground" Value="#FF0000"/>--> 
          </Trigger> 
         </ControlTemplate.Triggers> 
        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
     </Style> 

    </Application.Resources> 
</Application> 

編集:ボタンが

方法で正常に動作しています!編集2:

私は自分のやり方でコンボボックスを修正しようとしていましたが、ControlTemplateとScrollViewerのいずれの組み合わせも成功しませんでした。これは私のアプリケーションで欠けている唯一のコンポーネントです。私はこのような多くのソリューションを読んで試してみました。How to style ComboBox Background on Mouse Hover?

そのため私は解決してください。私がプログラミングの論理的な部分に焦点を当てているので、xamlのより複雑な部分の全体的な理解は、コンボボックスの強調表示の1つのために私にとって重要ではありません。 マウスが赤色になり、残りのコンボボックスが標準のままである間に、色の境界を変更しているコンボボックスを持っていたいと思います。この1つのプロパティ。どのように私はそれを迅速に変更することができますか

+0

このスタイルを使用しているテキストボックスの例を提供できますか? – osmanraifgunes

+1

jan - オリジナルの問題(テキストボックス)が回答済みとマークされていて、コンボボックスの問題が異なるため、別の投稿として "編集2"を作成することができます。 –

答えて

2

TextBoxは、内容を配置できる場所で「PART_ContentHost」という名前のコントロールが必要です。実際のTextBox ScrollViewerのデフォルトのテンプレートでは、このために使用されているので、修正するための一つの方法は、とあなたのContentPresenterを置き換えることです:

<ControlTemplate TargetType="TextBox"> 
    <Border CornerRadius="2" 
      BorderThickness="2" 
      BorderBrush="{TemplateBinding BorderBrush}" 
      Background="{TemplateBinding Background}" 
      x:Name="PART_ContentHost" /> 
      <ControlTemplate.Triggers> 
       <Trigger Property="IsMouseOver" Value="True"> 
        <Setter TargetName="PART_ContentHost" 
          Property="BorderBrush" 
          Value="#FF0000" /> 
       </Trigger> 
      </ControlTemplate.Triggers> 
</ControlTemplate> 

UPDATE:

<ScrollViewer x:Name="PART_ContentHost" /> 

は、別の方法としては、コンテンツのホストとして、あなたのボーダーを使用することができます。なぜPART_ContentHost?あなたが何らかのコントロールの作者であるとします。他の人が提供するControlTemplateで動作するように、コントロールを設計しようとします。しかし、必ずしもそうであるとは限りません。特定の条件を満たすためにテンプレートの特定の部分が必要な場合もあります。この場合、TextBoxの作成者はテンプレート内にScrollViewerまたはDecoratorのいずれかのコントロールを検出し、名前は「PART_ContentHost」です。彼が後でそのコントロールで行うことは、私たちにとっては無関係です.TextBoxは、通常の機能のために、テンプレートに "PART_ContentHost"という名前のコントロールを必要とします。コントロールの作成者は、そのような要件をどのように表現できますか? Via TemplatePart属性。この属性は、上記のような要件を表す以外は何もしません。 TextBoxが継承するTextBoxBaseコントロールを見ると、次のようになります。

[TemplatePart(Name = "PART_ContentHost", Type = typeof (FrameworkElement))] 
+0

@mikesは私の答えをより詳細に更新しました。 – Evk

+0

答え、素早く、具体的かつ有用な説明と説明をいただきありがとうございます。良い一日を過ごしてください ! –

関連する問題