【问题标题】:Show Border on avalonEdit:TextEditor在 avalonEdit:TextEditor 上显示边框
【发布时间】:2025-12-29 01:35:06
【问题描述】:

我正在尝试在 Wpf 控件中的 avalonEdit“框”周围显示边框,但似乎无法实现。

我添加了BorderBrush="Black" BorderThickness="2",但显然我遗漏了一些东西。

我在 Google 上搜索过,但尽管我很努力,但我找不到任何东西 - 我怀疑我可能不知道 Google 的正确术语,因为它感觉应该是直截了当的!

代码如下:

    <Label Content="Account:" HorizontalAlignment="Left" Margin="10,28,0,0" VerticalAlignment="Top"/>
    <TextBox Name ="textBoxAccount" HorizontalAlignment="Left" Height="23" Margin="66,28,0,0" TextWrapping="Wrap" Text="" VerticalAlignment="Top" Width="120"/>
    <Label Content="Query:" HorizontalAlignment="Left" Margin="10,59,0,0" VerticalAlignment="Top"/>

    <Button x:Name="btnGo" Content="Go!" HorizontalAlignment="Left" Height="25" Margin="10,342,0,0" VerticalAlignment="Top" Width="146"/>

    <avalonEdit:TextEditor
        xmlns:avalonEdit="http://icsharpcode.net/sharpdevelop/avalonedit"
        x:Name="textEditor"
        FontFamily="Consolas"
        SyntaxHighlighting="AWQL"
        ScrollViewer.VerticalScrollBarVisibility="Hidden"
        WordWrap="True"
        Visibility="Visible"
        BorderBrush="Black" BorderThickness="2"
        FontSize="10pt" Margin="12,89.96,10,0" Height="229" VerticalAlignment="Top"/>
</Grid>

呈现如下:

但“avalonEdit”框似乎没有呈现边框,因此看起来不可见,除非/直到用户在其中单击并开始输入。

我真的希望边框看起来与用户控件顶部的简单文本框相同,但现在我会满足于任何可见的东西!

【问题讨论】:

    标签: c# wpf xaml avalonedit


    【解决方案1】:

    我之前只与 avalon 合作过一次,所以我制作了一个快速项目,可以满足您的需求。

    作为免责声明,AvalonEdit 似乎破坏了任何像你说的那样在它周围设置边框的尝试。所以我用一个网格来设置它,在它周围加上一个边框。

    它看起来像这样:

    代码将如下所示:

    <Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Width="600" Height="500"
        xmlns:avalonEdit="http://icsharpcode.net/sharpdevelop/avalonedit">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />
            <RowDefinition Height="Auto" />
            <RowDefinition Height="*" />
            <RowDefinition Height="Auto" />
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto" />
            <ColumnDefinition />
        </Grid.ColumnDefinitions>
    
        <Label Grid.Column="0" Grid.Row="0" Content="Account:" HorizontalAlignment="Left" Margin="20,20" VerticalAlignment="Top" Height="26" Width="56" />
        <TextBox Grid.Column="1" Grid.Row="0" Name="textBoxAccount" HorizontalAlignment="Left" Height="26" Margin="20" TextWrapping="Wrap"
                 VerticalAlignment="Top" Width="120" />
        <Label Grid.Column="0" Grid.Row="1" Content="Query:" HorizontalAlignment="Left" Margin="20,0" VerticalAlignment="Top" Height="26" Width="45" />
    
        <Border Grid.ColumnSpan="2"
                Grid.Row="2"
                Grid.Column="0" BorderBrush="Black" BorderThickness="1"
                Margin="20"
                Height="230">
            <avalonEdit:TextEditor
                x:Name="textEditor"
                FontFamily="Consolas"
                SyntaxHighlighting="AWQL"
                ScrollViewer.VerticalScrollBarVisibility="Hidden"
                WordWrap="True"
                Visibility="Visible"
                FontSize="10pt" VerticalAlignment="Top" Height="226"/>
        </Border>
    
    
        <Button Grid.Column="0" Grid.Row="3" x:Name="btnGo" Content="Go!" HorizontalAlignment="Left" Height="25" Margin="20"
                VerticalAlignment="Top" Width="146" />
    
    </Grid>
    

    这并不完全是您想要的,但从长远来看,网格也有助于解决其他问题

    【讨论】:

    • 感谢这个解释/解决方案,这绝对是一个改进。知道如何使边框看起来与其上方简单文本框周围的边框样式相同吗?
    • This 应该显示文本框的默认样式。如果您复制颜色、半径等,它应该是相同的。
    【解决方案2】:

    这是 avalonEdit:TextEditor 样式 (TextEditor.xaml):

    <Style TargetType="{x:Type AvalonEdit:TextEditor}">
        <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.WindowTextBrushKey}}" />
        <Setter Property="Background" Value="{DynamicResource {x:Static SystemColors.WindowBrushKey}}" />
        <Setter Property="FlowDirection" Value="LeftToRight"/> <!-- AvalonEdit does not support RTL, so ensure we use LTR by default -->
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type AvalonEdit:TextEditor}">
                    <ScrollViewer
                        Focusable="False"
                        Name="PART_ScrollViewer"
                        CanContentScroll="True"
                        VerticalScrollBarVisibility="{TemplateBinding VerticalScrollBarVisibility}"
                        HorizontalScrollBarVisibility="{TemplateBinding HorizontalScrollBarVisibility}"
                        Content="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=TextArea}"
                        VerticalContentAlignment="Top"
                        HorizontalContentAlignment="Left"
                        Background="{TemplateBinding Background}"
                        Padding="{TemplateBinding Padding}"
                        BorderBrush="{TemplateBinding BorderBrush}"
                        BorderThickness="{TemplateBinding BorderThickness}"
                    />
                    <ControlTemplate.Triggers>
                        <Trigger Property="WordWrap"
                                 Value="True">
                            <Setter TargetName="PART_ScrollViewer"
                                    Property="HorizontalScrollBarVisibility"
                                    Value="Disabled" />
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
    

    这是关于为什么 ScrollViewer 不显示边框的解释:https://social.msdn.microsoft.com/Forums/vstudio/en-US/a2310302-167b-44e2-bc23-825ff1610701/scrollviewer-border

    所以,我认为最好的方法是将 TextEditor 包装在 Border 中为 Guerudo says 或修改 Avalon 代码中的模板 TextEditor.xaml

    【讨论】:

      【解决方案3】:

      我没有使用 avalonEdit,但我可以建议您另一种方式:您可以将 TextEditor 包装在 &lt;Border&gt; &lt;/Border&gt; 中。

      这可能不是最好的解决方案,但它是一个。

      【讨论】:

      • 非常感谢您的建议,但我希望有更好的解决方案。因为这个建议只是在整个东西周围渲染了一个边框(不仅仅是 avalonEdit 文本框) - 我可能可以通过调整边距等将它组合在一起以使其更好,但感觉它在某处遗漏了一些简单的东西
      • 我建议您深入研究模板以了解发生了什么!