C# 文本框不显示任何文本后,我的风格与路径

C# 文本框不显示任何文本后,我的风格与路径,c#,wpf,xaml,C#,Wpf,Xaml,我使用PATH为文本框定制了一个样式。这个盒子看起来正是我想要的,但当我在里面写任何文本时,似乎什么都没有出现。我的风格中似乎有什么东西阻止了它,或者我需要添加一些东西来显示内容。但是我不知道到底是什么,有没有人知道我能做些什么来让文本显示在定制的框中 <Style x:Key="AppearingTextbox" TargetType="{x:Type TextBox}"> <Setter Property="Cursor" Value="Arrow"/> &l

我使用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 Style="{DynamicResource AppearingTextbox}" Height="30" Width="100" FontSize="10" Margin="0,480,0,0">
        Some text
</TextBox>

一些文本
谢谢很多人,我设法让它工作起来了。 我不能把它放在Border标记中,因为Border标记只接受一个子元素。 相反,我使用了网格。网格也很好,因为我在文档中读到,它允许将元素堆叠在彼此的顶部。 这就是我为将来遇到这个问题的人所做的

标记中,我执行了以下操作:

<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>

这立即使文本出现在我制作的框中。稍微做一点样式就可以使文本符合我的要求,仅此而已。

感谢很多人,并认为这解决了:(

<代码>文本框< /Cord>模板)需要命名的部分

<ScrollViewer x:Name="PART_ContentHost" />

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

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

编辑

<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>

文本框
模板需要命名零件

<ScrollViewer x:Name="PART_ContentHost" />

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

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

编辑

<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>

给出了
文本框
样式的示例,并列举了命名部件。对于
TextBox
,显示其内容的是PART\u ContentHost。在默认模板中,它是
ScrollViewer

<ScrollViewer Margin="0" x:Name="PART_ContentHost" />
接下来我们需要将元素彼此对齐,然后可以添加
垂直对齐
水平对齐

<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>

最后你还有一个问题。默认情况下,文本颜色为黑色。您可以通过“覆盖前景”属性对其进行更改:

<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>

给出了
文本框
样式的示例,并列举了命名部件。对于
TextBox
,显示其内容的是PART\u ContentHost。在默认模板中,它是
ScrollViewer

<ScrollViewer Margin="0" x:Name="PART_ContentHost" />
接下来我们需要将元素彼此对齐,然后可以添加
垂直对齐
水平对齐

<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>

最后你还有一个问题。默认情况下,文本颜色为黑色。您可以通过“覆盖前景”属性对其进行更改:

<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>


因此,当您将文本添加为文本框的
内容
时,模板中的
内容
在哪里处理?将你的行为与默认行为相比,我敢打赌你会很快发现自己的愚蠢因此,当您将文本添加为文本框的
内容
时,模板中的
内容
在哪里处理?将你的行为与默认行为相比,我敢打赌你会很快发现自己的愚蠢我想教这个人钓鱼,但是+1,因为它是正确的。但是我应该把它放在哪里呢?当我尝试将它添加到控件模板中时,如果我没有,我会得到“属性可视化树设置了一次以上”。@ChrisW。我在网上读了一些东西,发现代码的特定部分需要在那里。但无论我把它放在哪里,我都会犯一些错误。我甚至尝试在堆栈面板中添加这两个选项,但什么也没有发生……我肯定遗漏了一些小东西。@IvanHorvatin您需要将您的
ControlTemplate
放在您希望输入/文本出现的位置,并且它的名称必须与此完全相同。我试图教这个人钓鱼,但是+1,因为它是正确的。但是我把它放在哪里呢?当我尝试将它添加到控件模板中时,如果我没有,我会得到“属性可视化树设置了一次以上”。@ChrisW。我在网上读了一些东西,发现代码的特定部分需要在那里。但无论我把它放在哪里,我都会犯一些错误。我甚至尝试在堆栈面板中添加这两个元素,但是什么也没发生……我肯定遗漏了一些小东西。@IvanHorvatin你需要把你的
控制模板
放在你希望输入/文本出现的地方,它的名称必须与之完全相同。我会选择你的答案,因为它非常广泛,并且为答案增加了很多内容。我刚刚更新了我的问题,为你提供了更详细的指南问题的每一部分。只有一个问题,SnapstoDevicePixel做什么,或者重写DefaultStyle。我选择TexBox是因为我可以用path设置它的样式。日分