【问题标题】:Text box not showing any text after i styled it with Path使用路径设置样式后,文本框不显示任何文本
【发布时间】:2016-01-04 18:25:48
【问题描述】:

我使用 PATH 为文本框制作了自定义样式。该框看起来正是我想要的,但是当我在其中写任何文本时,似乎什么也没有出现。似乎我的风格中的某些东西阻止了它,或者我需要添加一些东西才能显示内容。但我不确定到底是什么,有没有人知道我可以做些什么来让文本出现在定制的盒子里?

<Style x:Key="AppearingTextbox" TargetType="{x:Type TextBox}">
  <Setter Property="Cursor" Value="Arrow"/>
  <Setter Property="Foreground" Value="#3E82C4"/>
  <Setter Property="Background" Value="#0F1C2B"/>
  <Setter Property="Opacity" Value="0"/>
  <Setter Property="IsReadOnly" Value="True"/>
  <Setter Property="Template">
    <Setter.Value>
      <ControlTemplate TargetType="{x:Type TextBox}">
        <StackPanel>
          <Path Data="M0 0 30 0 50 -10 70 0 100 0 100 30 0 30z" Fill="#0F1C2B"/>
        </StackPanel>
      </ControlTemplate>
    </Setter.Value>
  </Setter>
  <Style.Triggers>
    <DataTrigger Binding="{Binding ElementName=Ikona, Path=IsMouseOver}" Value="True">
      <DataTrigger.EnterActions>
        <BeginStoryboard >
          <Storyboard TargetProperty="Opacity" Duration="00:00:00.3" AutoReverse="False">
            <DoubleAnimation From="0" To="1" Duration="00:00:00.3"/>
          </Storyboard>
        </BeginStoryboard>
      </DataTrigger.EnterActions>
      <DataTrigger.ExitActions>
        <BeginStoryboard >
          <Storyboard TargetProperty="Opacity" Duration="00:00:00.3" AutoReverse="False">
            <DoubleAnimation From="1" To="0" Duration="00:00:00.3"/>
          </Storyboard>
        </BeginStoryboard>
      </DataTrigger.ExitActions>
    </DataTrigger>
  </Style.Triggers>
</Style>

应用到这个TextBox:

<TextBox Style="{DynamicResource AppearingTextbox}" Height="30" Width="100" FontSize="10" Margin="0,480,0,0">
        Some text
</TextBox>

感谢一群人,我设法让它工作。 我不能把它放在边框标签内,因为边框标签只接受 1 个子元素。 相反,我使用了网格。网格也很好,因为在文档中我在某处读到它允许将元素堆叠在一起。 这就是我为将来偶然发现此问题的任何人所做的。

&lt;ControlTemplate&gt; 标签中,我做了以下操作:

<ControlTemplate TargetType="{x:Type TextBox}">
  <Grid>
    <Path Data="M0 0 30 0 50 -10 70 0 100 0 100 30 0 30z" Fill="#0F1C2B"/>
    <ScrollViewer Margin="0" x:Name="PART_ContentHost" />
  </Grid>
</ControlTemplate>

这立即使文本出现在我制作的框中。一点点样式使文本正好在我想要的位置,但仅此而已。
非常感谢并认为这已解决:)

【问题讨论】:

  • 因此,当您将文本添加为​​ TextBox 的 Content 时,您的 Content 在模板中的哪个位置处理?将您的与默认值进行比较,我敢打赌您很快就会发现自己的愚蠢行为。 :)

标签: c# wpf xaml


【解决方案1】:

TextBox 模板需要命名部分

<ScrollViewer x:Name="PART_ContentHost" />

托管其内容并提供编辑功能

来自MSDN

可以包含 FrameworkElement 的可视元素。 TextBox 的文本显示在此元素中。

编辑

<ControlTemplate TargetType="{x:Type TextBox}">
   <Grid>
      <Path Data="M0 0 30 0 50 -10 70 0 100 0 100 30 0 30z" Fill="#0F1C2B"/>
      <ScrollViewer x:Name="PART_ContentHost"/>
   </Grid>
</ControlTemplate>

【讨论】:

  • 正试图教这个人钓鱼,但是 +1 因为它是正确的。
  • 但是我把它放在哪里呢?当我尝试将它添加到控制模板中时,如果我没有 ,我会得到“属性可视树设置不止一次。”
  • @ChrisW。我在网上读了一点,发现代码的特定部分需要在那里。但无论我试图把它放在哪里,我都会遇到一些错误。我什至尝试在堆栈面板中添加两者,但没有任何反应......我肯定错过了一些小东西......
  • @IvanHorvatin 您需要将ControlTemplate 放在您希望输入/文本出现的位置,并且必须完全如此命名。
【解决方案2】:

MSDN 给出了TextBox 样式的示例并枚举了命名部分。对于TextBox,它是显示其内容的 PART_ContentHost。默认模板是ScrollViewer:

<ScrollViewer Margin="0" x:Name="PART_ContentHost" />

如果将其添加到StackPanel,元素将连续显示,但您需要在Path 前面显示文本。然后把StackPanel改成Grid

<Grid>
    <Path Data="M0 0 30 0 50 -10 70 0 100 0 100 30 0 30z" Fill="#0F1C2B"/>
    <ScrollViewer Margin="0" x:Name="PART_ContentHost" />
</Grid>

接下来我们需要将元素相互对齐,然后你可以添加VerticalAlignmentHorizontalAlignment

<Grid>
    <Path VerticalAlignment="Center" HorizontalAlignment="Center" Data="M0 0 30 0 50 -10 70 0 100 0 100 30 0 30z" Fill="#0F1C2B"/>
    <ScrollViewer VerticalAlignment="Center" HorizontalAlignment="Center" Margin="0" x:Name="PART_ContentHost"  />
</Grid>

最后你还有一个问题。默认情况下,文本颜色为黑色。您可以通过覆盖 Foreground 属性来更改它:

<Setter Property="Foreground" Value="White" />

完整样式如下所示:

<Style x:Key="AppearingTextbox" TargetType="{x:Type TextBox}">
    <Setter Property="Cursor" Value="Arrow"/>
    <Setter Property="Foreground" Value="#3E82C4"/>
    <Setter Property="Background" Value="#0F1C2B"/>
    <Setter Property="Opacity" Value="0"/>
    <Setter Property="IsReadOnly" Value="True"/>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type TextBoxBase}">
                <Grid>
                    <Path VerticalAlignment="Center" HorizontalAlignment="Center" Data="M0 0 30 0 50 -10 70 0 100 0 100 30 0 30z" Fill="#0F1C2B"/>
                    <ScrollViewer VerticalAlignment="Center" HorizontalAlignment="Center" Margin="0" x:Name="PART_ContentHost" />
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
    <Style.Triggers>
        <DataTrigger Binding="{Binding ElementName=Ikona, Path=IsMouseOver}" Value="True">
            <DataTrigger.EnterActions>
                <BeginStoryboard >
                    <Storyboard TargetProperty="Opacity" Duration="00:00:00.3" AutoReverse="False">
                        <DoubleAnimation From="0" To="1" Duration="00:00:00.3"/>
                    </Storyboard>
                </BeginStoryboard>
            </DataTrigger.EnterActions>
            <DataTrigger.ExitActions>
                <BeginStoryboard >
                    <Storyboard TargetProperty="Opacity" Duration="00:00:00.3" AutoReverse="False">
                        <DoubleAnimation From="1" To="0" Duration="00:00:00.3"/>
                    </Storyboard>
                </BeginStoryboard>
            </DataTrigger.ExitActions>
        </DataTrigger>
    </Style.Triggers>
</Style>

【讨论】:

  • 我会选择你的答案,因为它非常广泛并且为答案添加了很多内容
  • NP 我刚刚更新了我的问题,以便为问题的每个部分提供更详细的指南。
  • 只有一个问题,SnapsToDevicePixels 是做什么的,或者 OverridesDefaultStyle。我选择 TexBox 是因为我可以用路径设置它的样式。但不想在其中输入任何内容,所以我使用了 IsReadOnly 部分
  • SnapsToDevicePixels 防止像素模糊。它确定在渲染期间是否应使用特定于设备的像素设置来渲染此元素。我也更新了我的答案,因为这个属性已经设置为基本样式。
  • 那应该什么时候使用呢?非常感谢:)
猜你喜欢
  • 1970-01-01
  • 2014-03-05
  • 2012-02-27
  • 1970-01-01
  • 2010-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-25
相关资源
最近更新 更多