【问题标题】:Using a ControlTemplate to display a "browse" button beside a textbox used for filenames使用 ControlTemplate 在用于文件名的文本框旁边显示“浏览”按钮
【发布时间】:2010-06-29 06:46:21
【问题描述】:

我正在尝试将“浏览”按钮附加到许多包含文件名的文本框中。

我的目标是这样的:

<TextBox Text="c:\Filename.txt" Template="{StaticResource FileBrowser}"/>

我声明的控件模板如下:

<Window.Resources>
    <ControlTemplate x:Key="FileBrowser" TargetType="{x:Type TextBox}">
        <Grid Grid.Row="{TemplateBinding Grid.Row}" Grid.Column="{TemplateBinding Grid.Column}">
            <Grid.ColumnDefinitions>
                <ColumnDefinition />
                <ColumnDefinition Width="Auto"/>
            </Grid.ColumnDefinitions>

            <ContentPresenter Grid.Column="0" Grid.Row="0"/>
            <Button Grid.Column="1" Content="..."/>
        </Grid>
    </ControlTemplate>
</Window.Resources>

但是当我尝试使用它时,那里不再有 TextBox。只有一个空格,后跟“...”

有谁知道我做错了什么?这种事情只能通过制作新的UserControl来解决吗?

【问题讨论】:

    标签: c# wpf controltemplate openfiledialog


    【解决方案1】:

    TextBox 定义了一个名为“PART_ContentHost”的 ScrollViewer 类型的 TemplatePart。代码中的所有文本处理都依赖于模板中存在的这个元素。由于您尚未将其包含在模板中,因此 TextBox 基本上已损坏。将您的 ContentPresenter 改为:

    <ScrollViewer x:Name="PART_ContentHost" Grid.Column="0" Grid.Row="0"/>
    

    【讨论】:

      【解决方案2】:

      ContentPresenter 将只提供内容(文本字符串),它不会提供文本框布局。

      对于这种情况,创建一个 Usercontrol 或 ContentControl。

      【讨论】:

        【解决方案3】:

        TextBox 不是 ContentControl,因此无法理解 ContentPresenter。

        但是,您可以使用 TemplateBinding 将 ContentPresenter 指向正确的方向,并指向您的 Text 属性:

        <ContentPresenter Grid.Column="0" Grid.Row="0" Content="{TemplateBinding Text}" />
        

        现在它将文本表示为新内容。

        另外,您可能需要重新考虑使用 ContentPresenter,只需使用 TextBlock 代替 ContentPresenter。

        <TextBlock Grid.Column="0" Grid.Row="0" Text="{TemplateBinding Text}" />
        

        【讨论】:

          【解决方案4】:

          试试这个 xaml...

              <Window.Resources>
              <LinearGradientBrush x:Key="NormalBrush" EndPoint="0,1" StartPoint="0,0">
                  <GradientStop Color="#EEE" Offset="0.0"/>
                  <GradientStop Color="#CCC" Offset="1.0"/>
              </LinearGradientBrush>
              <LinearGradientBrush x:Key="NormalBorderBrush" EndPoint="0,1" StartPoint="0,0">
                  <GradientStop Color="#CCC" Offset="0.0"/>
                  <GradientStop Color="#444" Offset="1.0"/>
              </LinearGradientBrush>
          
              <!-- LightBrush is used for content areas such as Menu, Tab Control background -->
              <LinearGradientBrush x:Key="LightBrush" EndPoint="0,1" StartPoint="0,0">
                  <GradientStop Color="#FFF" Offset="0.0"/>
                  <GradientStop Color="#EEE" Offset="1.0"/>
              </LinearGradientBrush>
          
              <!-- MouseOverBrush is used for MouseOver in Button, Radio Button, CheckBox -->
              <LinearGradientBrush x:Key="MouseOverBrush" EndPoint="0,1" StartPoint="0,0">
                  <GradientStop Color="#FFF" Offset="0.0"/>
                  <GradientStop Color="#AAA" Offset="1.0"/>
              </LinearGradientBrush>
          
              <!-- PressedBrush is used for Pressed in Button, Radio Button, CheckBox -->
              <LinearGradientBrush x:Key="PressedBrush" EndPoint="0,1" StartPoint="0,0">
                  <GradientStop Color="#BBB" Offset="0.0"/>
                  <GradientStop Color="#EEE" Offset="0.1"/>
                  <GradientStop Color="#EEE" Offset="0.9"/>
                  <GradientStop Color="#FFF" Offset="1.0"/>
              </LinearGradientBrush>
              <LinearGradientBrush x:Key="PressedBorderBrush" EndPoint="0,1" StartPoint="0,0">
                  <GradientStop Color="#444" Offset="0.0"/>
                  <GradientStop Color="#888" Offset="1.0"/>
              </LinearGradientBrush>
          
              <!-- SelectedBackgroundBrush is used for the Selected item in ListBoxItem, ComboBoxItem-->
              <SolidColorBrush x:Key="SelectedBackgroundBrush" Color="#DDD"/>
          
              <!-- Disabled Brushes are used for the Disabled look of each control -->
              <SolidColorBrush x:Key="DisabledForegroundBrush" Color="#888"/>
              <SolidColorBrush x:Key="DisabledBackgroundBrush" Color="#EEE"/>
              <SolidColorBrush x:Key="DisabledBorderBrush" Color="#AAA"/>
          
              <!-- Used for background of ScrollViewer, TreeView, ListBox, Expander, TextBox, Tab Control -->
              <SolidColorBrush x:Key="WindowBackgroundBrush" Color="#FFF"/>
          
              <!-- DefaultedBorderBrush is used to show KeyBoardFocus -->
              <LinearGradientBrush x:Key="DefaultedBorderBrush" EndPoint="0,1" StartPoint="0,0">
                  <GradientStop Color="#777" Offset="0.0"/>
                  <GradientStop Color="#000" Offset="1.0"/>
              </LinearGradientBrush>
          
              <SolidColorBrush x:Key="SolidBorderBrush" Color="#888"/>
              <SolidColorBrush x:Key="LightBorderBrush" Color="#AAA"/>
              <SolidColorBrush x:Key="LightColorBrush" Color="#DDD"/>
          
              <!-- Used for Checkmark, Radio button, TreeViewItem, Expander ToggleButton glyphs -->
              <SolidColorBrush x:Key="GlyphBrush" Color="#444"/>
              <!-- Simple TextBox -->
              <Style x:Key="SimpleTextBox" TargetType="{x:Type TextBox}">
                  <Setter Property="KeyboardNavigation.TabNavigation" Value="None"/>
                  <Setter Property="FocusVisualStyle" Value="{x:Null}"/>
                  <Setter Property="AllowDrop" Value="true"/>
                  <Setter Property="Template">
                      <Setter.Value>
                          <ControlTemplate TargetType="{x:Type TextBox}">
                              <Grid>
                                  <Grid.ColumnDefinitions>
                                      <ColumnDefinition/>
                                      <ColumnDefinition Width="Auto"/>
                                  </Grid.ColumnDefinitions>
                                  <Border x:Name="Border" Background="{DynamicResource WindowBackgroundBrush}" BorderBrush="{DynamicResource SolidBorderBrush}" BorderThickness="1" Padding="2" CornerRadius="2">
          
                                      <!-- The implementation places the Content into the ScrollViewer. It must be named PART_ContentHost for the control to function -->
                                      <ScrollViewer Margin="0" x:Name="PART_ContentHost" Style="{DynamicResource SimpleScrollViewer}" Background="{TemplateBinding Background}"/>
          
                                  </Border>
                                  <Button HorizontalAlignment="Stretch" Width="25" Content="..." Grid.Column="1" Margin="1"/>
                              </Grid>
                              <ControlTemplate.Triggers>
                                  <Trigger Property="IsEnabled" Value="False">
                                      <Setter Property="Background" Value="{DynamicResource DisabledBackgroundBrush}" TargetName="Border"/>
                                      <Setter Property="BorderBrush" Value="{DynamicResource DisabledBackgroundBrush}" TargetName="Border"/>
                                      <Setter Property="Foreground" Value="{DynamicResource DisabledForegroundBrush}"/>
                                  </Trigger>
                              </ControlTemplate.Triggers>
                          </ControlTemplate>
                      </Setter.Value>
                  </Setter>
              </Style>
          
          </Window.Resources>
          <Grid>
              <TextBox Style="{StaticResource SimpleTextBox}" Height="25"></TextBox>
          </Grid>
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2020-02-21
            • 1970-01-01
            • 2023-03-27
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多