Размытые метки прямоугольника WPF - PullRequest
0 голосов
/ 09 июля 2020

Я использую приведенный ниже код для рисования текста поверх прямоугольника на холсте WPF, но кажется, что он растягивает / сквашивает. Я ищу способ убедиться, что поле всегда заполнено, а текст ясен. Возможно какая-то форма Dynami c размер шрифта?

Спасибо.

введите описание изображения здесь

Rectangle elip = new Rectangle();
elip.Height = 6;
elip.Width = 6;   

Brush brush = new SolidColorBrush(Color.FromRgb(n.Value.R,
                            n.Value.G, n.Value.B));

Label TB = new Label();
TB.HorizontalAlignment = HorizontalAlignment.Stretch;
TB.Margin = new Thickness(0, 0, 0, 0);
TB.Background = brush;
TB.FontSize = 12;
TB.HorizontalContentAlignment = HorizontalAlignment.Center;
TB.Content = n.Value.Stations[0].TrackId;

BitmapCacheBrush bcb = new BitmapCacheBrush(TB);
elip.Fill = bcb;
elip.Stroke = Brushes.Black;
elip.StrokeThickness = 0.5;
elip.MouseDown += ElipOnMouseDown;
Canvas.SetTop(elip, n.Value.Y - elip.Width / 2);
Canvas.SetLeft(elip, n.Value.X - elip.Height / 2);
cMain.Children.Add(elip);

Ответы [ 2 ]

0 голосов
/ 09 июля 2020

На мой взгляд, вы неправильно составляете элементы. Прямоугольник - только проблемы.

Вам нужно использовать Border. Сделайте ему рамку и фон. Чтобы отображать текст с настраиваемым размером шрифта, вам необходимо объединить ViewBox и TextBlock.

Граница со всем ее содержимым уже может быть расположена на холсте, как вам нужно.

Пример XAML:

    <Border BorderThickness="3" 
            BorderBrush="Black" 
            Background="Violet"
            Width="100" Height="100"
            Canvas.Top="20"
            Canvas.Left="50">
        <Viewbox>
            <TextBlock Text="1234" Margin="5"/>
        </Viewbox>
    </Border>

Также обратите внимание, что типичной реализацией такой задачи является использование ItemsControl. Если вам нужен выбор, то ListBox. В ItemsControl коллекция с данными для всех элементов привязана к свойству ItemsSource. Как эти элементы должны отображаться, задается шаблоном в ItemTemplate. Шаблон требуемой панели устанавливается в ItemPanel. Позиционировать элементы в ItemContainerStyle.

В то же время Code Behind в C # вообще не используется. Все делается в XAML.

0 голосов
/ 09 июля 2020

Вы можете растянуть текст с помощью окна просмотра.

Я рекомендую использовать пользовательский элемент управления для инкапсуляции всей вашей разметки для подобных вещей. У вас должно быть много тысяч этих вещей, прежде чем накладные расходы на пользовательский элемент управления против построения прямоугольников и прочего будут значительными.

Я создал этот пользовательский элемент управления:

         Height="18" Width="24">
        <Border BorderBrush="Black"
                BorderThickness="1"
                Background="Magenta"
                >
        <Viewbox Stretch="Uniform">
            <TextBlock Text="{Binding Tag, RelativeSource={RelativeSource AncestorType=UserControl}}"
                       TextAlignment="Center"
                       Margin="2"
                       />
        </Viewbox>
    </Border>
</UserControl>
* 1007 вы хотите с точки зрения ширины, высоты или чего-то еще.

Вы можете создать один из них, установить его тег, холст сверху и слева и добавить его на холст.

Вот эквивалентная разметка I использовали, чтобы доказать это:

    Title="MainWindow" >
    <Grid>
        <Canvas>
            <local:StationView Canvas.Left="20"
                               Canvas.Top="100"
                               Tag="16B"/>
    </Canvas>
    </Grid>
    </Window>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...