none
求文字纵向显示的方法 RRS feed

  • 问题

  • 就像WP7待机壁纸上的文字一样,可以从上往下显示,我需要在宽200的区域内显示一堆纵向文字,从右向左显示,请问版主可有解决办法?小弟感激不尽!!
    2012年10月22日 7:18

答案

  • 使用RichTextBlock和RichTextBlockOverflow2个控件。

    微软的模版中有一个RichTextColumns的自定义控件,就是使用RichTextBlock和RichTextBlockOverflow来实现的, 具体用法

    <common:RichTextColumns> <RichTextBlock> </RichTextBlock> <common:RichTextColumns.ColumnTemplate> <DataTemplate> <RichTextBlockOverflow> </RichTextBlockOverflow> </DataTemplate>

    <common:RichTextColumns.ColumnTemplate> </common:RichTextColumns>



    Thanks! Damon.Tian

    2012年10月22日 9:01
  • 建议通过DirectWriter 来绘制纵向文字。

    或者可以自己设计XAML空间,利用Run + LineBreak 达到纵向效果。

    比如:C#

        public sealed class VerticalText : Control
        {
            public VerticalText()
            {
                this.DefaultStyleKey = typeof(VerticalText);
            }
            public string Text
            {
                get { return (string)GetValue(TextProperty); }
                set { SetValue(TextProperty, value); }
            }
            public static readonly DependencyProperty TextProperty =
               DependencyProperty.Register("Text", typeof(string), typeof(VerticalText), new PropertyMetadata(""));
            private StackPanel TextPanel;
            protected override void OnApplyTemplate()
            {
                base.OnApplyTemplate();
                TextPanel = this.GetTemplateChild("panel") as StackPanel;
                TextBlock text = new TextBlock()
                {
                    FontFamily = this.FontFamily,
                    FontStretch = this.FontStretch,
                    FontSize = this.FontSize,
                    FontWeight = this.FontWeight,
                    FontStyle = this.FontStyle
                };
                TextPanel.Children.Add(text);
                double height = 0.0;
                foreach (char c in Text.ToCharArray())
                {
                    text.Inlines.Add(new Run() { Text = c.ToString() });
                    text.Inlines.Add(new LineBreak());
                    text.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity));
                    if (text.ActualHeight >= this.Height)
                    {
                        height = 0.0;
                        text = new TextBlock()
                        {
                            FontFamily = this.FontFamily,
                            FontStretch = this.FontStretch,
                            FontSize = this.FontSize,
                            FontWeight = this.FontWeight,
                            FontStyle = this.FontStyle
                        };
                        TextPanel.Children.Add(text);
                    }
                }
            }
        }

    Style:

        <Style TargetType="local:VerticalText">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="local:VerticalText">
                        <Border
                            Background="{TemplateBinding Background}"
                            BorderBrush="{TemplateBinding BorderBrush}"
                            BorderThickness="{TemplateBinding BorderThickness}">
                            <StackPanel x:Name="panel" Orientation="Horizontal"/>
                        </Border>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>

    使用

            <local:VerticalText Height="768" FlowDirection="RightToLeft"
                   Text="测试 中文 测试 中文 测试 中文 测试 中文" FontSize="30"/>

    完整例子:https://skydrive.live.com/#cid=51B2FDD068799D15&id=51B2FDD068799D15%211127

    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us

    • 已标记为答案 kotenkai 2012年10月24日 6:44
    2012年10月23日 6:47
    版主

全部回复

  • 使用RichTextBlock和RichTextBlockOverflow2个控件。

    微软的模版中有一个RichTextColumns的自定义控件,就是使用RichTextBlock和RichTextBlockOverflow来实现的, 具体用法

    <common:RichTextColumns> <RichTextBlock> </RichTextBlock> <common:RichTextColumns.ColumnTemplate> <DataTemplate> <RichTextBlockOverflow> </RichTextBlockOverflow> </DataTemplate>

    <common:RichTextColumns.ColumnTemplate> </common:RichTextColumns>



    Thanks! Damon.Tian

    2012年10月22日 9:01
  • 建议通过DirectWriter 来绘制纵向文字。

    或者可以自己设计XAML空间,利用Run + LineBreak 达到纵向效果。

    比如:C#

        public sealed class VerticalText : Control
        {
            public VerticalText()
            {
                this.DefaultStyleKey = typeof(VerticalText);
            }
            public string Text
            {
                get { return (string)GetValue(TextProperty); }
                set { SetValue(TextProperty, value); }
            }
            public static readonly DependencyProperty TextProperty =
               DependencyProperty.Register("Text", typeof(string), typeof(VerticalText), new PropertyMetadata(""));
            private StackPanel TextPanel;
            protected override void OnApplyTemplate()
            {
                base.OnApplyTemplate();
                TextPanel = this.GetTemplateChild("panel") as StackPanel;
                TextBlock text = new TextBlock()
                {
                    FontFamily = this.FontFamily,
                    FontStretch = this.FontStretch,
                    FontSize = this.FontSize,
                    FontWeight = this.FontWeight,
                    FontStyle = this.FontStyle
                };
                TextPanel.Children.Add(text);
                double height = 0.0;
                foreach (char c in Text.ToCharArray())
                {
                    text.Inlines.Add(new Run() { Text = c.ToString() });
                    text.Inlines.Add(new LineBreak());
                    text.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity));
                    if (text.ActualHeight >= this.Height)
                    {
                        height = 0.0;
                        text = new TextBlock()
                        {
                            FontFamily = this.FontFamily,
                            FontStretch = this.FontStretch,
                            FontSize = this.FontSize,
                            FontWeight = this.FontWeight,
                            FontStyle = this.FontStyle
                        };
                        TextPanel.Children.Add(text);
                    }
                }
            }
        }

    Style:

        <Style TargetType="local:VerticalText">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="local:VerticalText">
                        <Border
                            Background="{TemplateBinding Background}"
                            BorderBrush="{TemplateBinding BorderBrush}"
                            BorderThickness="{TemplateBinding BorderThickness}">
                            <StackPanel x:Name="panel" Orientation="Horizontal"/>
                        </Border>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>

    使用

            <local:VerticalText Height="768" FlowDirection="RightToLeft"
                   Text="测试 中文 测试 中文 测试 中文 测试 中文" FontSize="30"/>

    完整例子:https://skydrive.live.com/#cid=51B2FDD068799D15&id=51B2FDD068799D15%211127

    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us

    • 已标记为答案 kotenkai 2012年10月24日 6:44
    2012年10月23日 6:47
    版主