2009-09-10 17 views

答えて

10

コンボボックスや日付選択ツールなどが必要な場合は、新しいコントロールを作成する必要があります。この新しいコントロールの中に、テキストボックスのフレームのようなフレーム内にテキストボックスとボタンを並べて配置します。テキストボックスにフレームがないようにスタイルを変更します。

「文書」の中にボタンを入れたいが、コンボボックスの代わりに使うのであれば、豊富な編集の中にボタンを置くのはすばらしい。

あなたはまた、ラベルを使用して、その中にボタンを含めるために、そのテンプレートを変更することができComboBoxコントロールテンプレートMSDN

+0

以下のようなGrid.Columnを使用しています。 Border要素を使用して、テキストボックスの外側の境界線をエミュレートし、実際のボーダーレスのテキストボックスとボタンをグリッド内に配置しました。 –

+0

コンボボックステンプレートへのリンク+1。 –

0

テキストボックスの代わりにRichTextBoxを使用でき、ボタンを配置できるフロードキュメントをサポートしています。

0

を参照してください。 LabelとTextBlockの相違点の概要を確認するには、this postを参照してください。

5

テキストボックスコントロールを作成しました。これを追加しました。 別のテキストボックスを再作成するので、理想的な状況ではなく動作するようです。

<TextBox.Template> 
<ControlTemplate> 
     <Grid> 
      <Grid.ColumnDefinitions></Grid.ColumnDefinitions> 
      <TextBox Grid.Column="0"></TextBox> 
      <Button HorizontalAlignment="Right" Width="25" Grid.Column="1"> 
      </Button> 
     </Grid>   
    </ControlTemplate> 
</TextBox.Template> 
4

このリンクが役立つ:http://msdn.microsoft.com/en-us/library/ms752068(VS.85).aspxが見つかりました。

"TextBoxのControlTemplateには、コンテンツホスト要素としてタグ付けされた要素が1つ含まれていなければなりません(TextBoxのコンテンツのレンダリングに使用されます)。コンテンツホスト要素は、ScrollViewerまたはAdornerDecoratorのいずれかである必要があります。コンテンツホスト要素は、子要素をホストしていない可能性があります。

0

これを行う正しい方法は、テキストボックスにコントロールテンプレートを使用することです。以下のようなもの。私はこれを、テキストボックスから継承しButtonBoxというクラスの内部で使用しました。私は、このなどDateBox、DateTimeBox、SqlServerConnectBoxとして

xmlns:mwt="clr-namespace:Microsoft.Windows.Themes;assembly=PresentationFramework.Aero" 

<TextBox.Template> 
    <ControlTemplate TargetType="{x:Type TextBoxBase}"> 
     <mwt:ListBoxChrome 
      Background="{TemplateBinding Panel.Background}" 
      BorderBrush="{TemplateBinding Border.BorderBrush}" 
      BorderThickness="{TemplateBinding Border.BorderThickness}" 
      RenderMouseOver="{TemplateBinding UIElement.IsMouseOver}" 
      RenderFocused="{TemplateBinding UIElement.IsKeyboardFocusWithin}" 
      Name="Bd" 
      SnapsToDevicePixels="True"> 

      <DockPanel> 
       <Button DockPanel.Dock="Right" Name="myButton" Padding="3,0" Click="myButton_Click">...</Button> 
       <ScrollViewer Name="PART_ContentHost" SnapsToDevicePixels="{TemplateBinding UIElement.SnapsToDevicePixels}"></ScrollViewer> 
      </DockPanel> 
     </mwt:ListBoxChrome> 
     <ControlTemplate.Triggers> 
      <Trigger Property="UIElement.IsEnabled"> 
       <Setter Property="Panel.Background" TargetName="Bd"> 
        <Setter.Value> 
         <DynamicResource ResourceKey="{x:Static SystemColors.ControlBrushKey}" /> 
        </Setter.Value> 
       </Setter> 
       <Setter Property="TextElement.Foreground"> 
        <Setter.Value> 
         <DynamicResource ResourceKey="{x:Static SystemColors.GrayTextBrushKey}" /> 
        </Setter.Value> 
       </Setter> 
       <Trigger.Value> 
        <s:Boolean>False</s:Boolean> 
       </Trigger.Value> 
      </Trigger> 
     </ControlTemplate.Triggers> 
    </ControlTemplate> 
</TextBox.Template> 

編集から他人を継承する:私はそれをコントロールしていないテキストボックスから継承するように、私が使っていた方法を変更しました。これは、コントロールが境界線、テキストボックス、ボタンで構成されているため、うまく機能します。私は上記の解決策に焦点を当てていました。これは新しいテンプレートです。私はコントロールをButtonBoxと呼んでいます。

<Style TargetType="{x:Type local:ButtonBox}"> 
    <Setter Property="Border.BorderThickness" Value="1"></Setter> 
    <Setter Property="Border.BorderBrush"> 
     <Setter.Value> 
      <LinearGradientBrush StartPoint="0,0" EndPoint="0,20" MappingMode="Absolute"> 
       <LinearGradientBrush.GradientStops> 
        <GradientStop Color="#FFABADB3" Offset="0.05" /> 
        <GradientStop Color="#FFE2E3EA" Offset="0.07" /> 
        <GradientStop Color="#FFE3E9EF" Offset="1" /> 
       </LinearGradientBrush.GradientStops> 
      </LinearGradientBrush> 
     </Setter.Value> 
    </Setter> 
    <Setter Property="Control.Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type local:ButtonBox}"> 
       <mwt:ListBoxChrome 
        Background="{TemplateBinding Panel.Background}" 
        BorderThickness="{TemplateBinding Border.BorderThickness}" 
        BorderBrush="{TemplateBinding Border.BorderBrush}" 
        RenderMouseOver="{TemplateBinding UIElement.IsMouseOver}" 
        RenderFocused="{TemplateBinding UIElement.IsKeyboardFocusWithin}" 
        Name="Bd" 
        SnapsToDevicePixels="True"> 
        <DockPanel> 
         <Button 
          DockPanel.Dock="Right" 
          Name="PART_Button" 
          Height="0" 
          Style="{x:Null}" 
          Margin="0" 
          Padding="3,0" 
          Content="{TemplateBinding local:ButtonBox.ButtonContent}" 
          IsTabStop="False">         
         </Button> 
         <TextBox 
          BorderBrush="{x:Null}" 
          BorderThickness="0" 
          Margin="0" 
          Name="PART_ContentHost" 
          IsReadOnly="{TemplateBinding TextBox.IsReadOnly}" 
          Text="{Binding RelativeSource={RelativeSource TemplatedParent}, Mode=TwoWay, Path=Text}">         
         </TextBox> 
         <!-- ScrollViewer Name="PART_ContentHost" SnapsToDevicePixels="{TemplateBinding UIElement.SnapsToDevicePixels}" Margin="1"></ScrollViewer --> 
        </DockPanel> 
       </mwt:ListBoxChrome> 
       <ControlTemplate.Triggers> 
        <Trigger Property="UIElement.IsEnabled"> 
         <Setter Property="Panel.Background" TargetName="Bd"> 
          <Setter.Value> 
           <DynamicResource ResourceKey="{x:Static SystemColors.ControlBrushKey}" /> 
          </Setter.Value> 
         </Setter> 
         <Setter Property="TextElement.Foreground"> 
          <Setter.Value> 
           <DynamicResource ResourceKey="{x:Static SystemColors.GrayTextBrushKey}" /> 
          </Setter.Value> 
         </Setter> 
         <Trigger.Value> 
          <s:Boolean>False</s:Boolean> 
         </Trigger.Value> 
        </Trigger> 
       </ControlTemplate.Triggers> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
    <Setter Property="IsTabStop" Value="False"></Setter> 
</Style> 
-1

グリッドを使用してこのタスクを実行できます。以下は、私がテキストボックスの右下部に表示されるボタンを作成する方法である:

<Grid> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="*" /> 
     </Grid.RowDefinitions> 

     <TextBox VerticalAlignment="Stretch" HorizontalAlignment="Stretch" Grid.Row="0" /> 

     <Button Content="Copy" Width="40" Height="40" HorizontalAlignment="Right" VerticalAlignment="Bottom" Margin="10" Grid.Row="0" /> 

</Grid> 
0

はちょうど私が実際に最終的にこの方法を選択したのと同じコード

<TextBox x:Name="txtUrl" Grid.Column="1" Margin="2,2,0,2" VerticalAlignment="Center" Padding="2" PreviewKeyDown="txtUrl_PreviewKeyDown" GotFocus="txtUrl_GotFocus" PreviewMouseDown="txtUrl_PreviewMouseDown"> 

</TextBox> 
<eo:BareButton x:Name="btnAddFavorite" Grid.Column=" 1" HorizontalAlignment="Right" Style="{StaticResource WindowButtonStyle }" Margin="2" > 
    <eo:BareButton.Template> 
     <ControlTemplate TargetType="{x:Type eo:BareButton}"> 
      <Border x:Name="PART_Border" Width="22" Height="22" Background="Transparent" VerticalAlignment="Center" Margin="2,0,0,0" CornerRadius="2"> 
       <Path 
      HorizontalAlignment="Center" 
      VerticalAlignment="Center" 
                  Fill="Yellow" 

      Data="M 2,9 L 8,8 10,2 13,8 19,9 15,13 16,19 10,15 5,19 6,13 2,9" 
     SnapsToDevicePixels="false" 
      Stroke="{Binding Foreground, RelativeSource={RelativeSource AncestorType={x:Type eo:BareButton}, Mode=FindAncestor}}" 
      StrokeThickness="1" /> 
      </Border> 
      <ControlTemplate.Triggers> 
       <Trigger Property="IsMouseOver" Value="True"> 
        <Setter TargetName="PART_Border" Property="BorderBrush" Value="#666"/> 
        <Setter TargetName="PART_Border" Property="BorderThickness" Value="1"/> 
       </Trigger> 
      </ControlTemplate.Triggers> 
     </ControlTemplate> 
    </eo:BareButton.Template> 

</eo:BareButton> 
関連する問題