Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > WPF и Silverlight > Label неправильно сообщает свой размер.


Автор: Seekeer 1.4.2011, 21:31
Необходимо сделать контрол, чтобы получить подобный коллаут:
http://keep4u.ru/full/be761395b1a57d9758cde5d594939194.html
Проблема в том, что он может быть использован для отображения разного количества текста. Так что ширина у него должна быть фиксированная, а высота такая, чтобы поместился весь текст. Проблема в том, что лейбл неправильно возвращает свою высоту, в связи с чем не получается нормально нарисовать вокруг него прямоугольник. Пробовал заменить лейбл на textblock - та же история.
 Вот то, что я написал:
Код

<Popup x:Class="Controls.Callout"
        x:ClassModifier="internal"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008" >
    <Grid>
        <Image>
            <Image.Source>
                <DrawingImage>
                    <DrawingImage.Drawing >
                        <GeometryDrawing Brush="Orange" x:Name="geometryDrawing">
                            <GeometryDrawing.Pen>
                                <Pen Brush="Black" Thickness="2"/>
                            </GeometryDrawing.Pen>
                            <GeometryDrawing.Geometry>
                                <CombinedGeometry GeometryCombineMode="Union">
                                    <CombinedGeometry.Geometry1>
                                        <RectangleGeometry x:Name="rectangel" 
                                                                   RadiusX="15" RadiusY="15" 
                                                                       Rect="0,30, 300,100"
                                                                   />
                                    </CombinedGeometry.Geometry1>
                                    <CombinedGeometry.Geometry2>
                                        <PathGeometry>
                                            <PathFigure StartPoint="30,30" IsClosed="False">
                                                <PolyLineSegment Points="15,0, 90,30"/>
                                            </PathFigure>
                                        </PathGeometry>
                                    </CombinedGeometry.Geometry2>
                                </CombinedGeometry>
                            </GeometryDrawing.Geometry>
                        </GeometryDrawing>
                    </DrawingImage.Drawing>
                </DrawingImage>
            </Image.Source>
       </Image>
        <Label Padding="5 20"  MaxWidth="300" Name="myLabel" FontSize="16" >
                   <!--Content="{Binding}">-->
               <!--MaxHeight="100" MaxWidth="300">-->
            <AccessText TextWrapping="Wrap" MaxHeight="50"/>
        </Label>
    </Grid>
</Popup>

Код

    internal partial class Callout : Popup
    {
        public Callout()
        {
            InitializeComponent();
        }
        protected override void OnOpened(System.EventArgs e)
        {
              rectangel = new RectangleGeometry(new Rect(0,30,300, myLabel.Height/2));
        }
    }


Автор: exBlender 5.4.2011, 21:24
В XAML это делается примерно так:
Код

<Grid Width="150" HorizontalAlignment="Left" VerticalAlignment="Top">
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto"/>
                <RowDefinition />
            </Grid.RowDefinitions>
            <Path Data="M8,0 L24,16 0,16 z" Fill="SteelBlue" HorizontalAlignment="Left" Margin="20,0,0,-1" Width="24" />
            <Border Grid.Row="1" Background="SteelBlue" CornerRadius="8" Padding="8">
                <TextBlock TextWrapping="Wrap" Text="ширина у него должна быть фиксированная, а высота такая, чтобы поместился весь текст."/>
            </Border>
        </Grid>

Это всё. Код только засылает нужный текст. При желании это можно вставить прямо в Label Template.

Автор: Rohoss 6.4.2011, 19:52
Цитата(Seekeer @  1.4.2011,  21:31 Найти цитируемый пост)
Необходимо сделать контрол, чтобы получить подобный коллаут:

В Expression Blend такие есть...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)