Выравнивание по правому краю содержимого вертикально ориентированной стек-панели - PullRequest
1 голос
/ 06 января 2012

Я хочу выровнять по правому краю содержимое, отображаемое в вертикально ориентированном StackPanel, я пробовал HorizontalAlignment="Right" на самом StackPanel и элемент управления в ListBox's DataTemplete (в данном случаеTextBox, но на самом деле у меня есть UserControl в реальном приложении)

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

not right-aligned

Вот xaml, довольно просто ...

<Window x:Class="WpfApplication2.MainWindow"
        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"
        xmlns:WpfApplication2="clr-namespace:WpfApplication2"
        mc:Ignorable="d"
        d:DataContext="{d:DesignInstance WpfApplication2:Model, IsDesignTimeCreatable=True}">
    <ListBox ItemsSource="{Binding Numbers}">
        <ListBox.ItemsPanel>
            <ItemsPanelTemplate>
                <StackPanel />
            </ItemsPanelTemplate>
        </ListBox.ItemsPanel>
        <ListBox.ItemTemplate>
            <DataTemplate>
                <TextBox Text="{Binding Mode=OneWay}" BorderBrush="Black" />
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>
</Window>

и вот модель, которую я использую, чтобы проверить это...

using System;
using System.Collections.Generic;
using System.Linq;

namespace WpfApplication2
{
    public class Model
    {
        [ThreadStatic]
        static IDictionary<int, string> dict;

        public string[] Numbers
        {
            get { return dict.OrderBy(x => x.Key).Select(x => x.Value).ToArray(); }
        }

        public Model()
        {
            if (dict != null) return;
            dict = new Dictionary<int, string>
                       {
                           {1, "one"}, 
                           {2, "two"},
                           {3, "three"},
                           {4, "four"},
                           {5, "five"},
                           {6, "six"},
                           {7, "seven"},
                           {8, "eight"},
                           {9, "nine"},
                           {10, "ten"},
                           {11, "eleven"},
                           {12, "twelve"},
                           {13, "thirteen"},
                           {14, "fourteen"},
                           {15, "fifteen"},
                           {16, "sixteen"},
                           {17, "seventeen"},
                           {18, "eighteen"},
                           {19, "nineteen"},
                           {20, "twenty"},
                           {30, "thirty"},
                           {40, "forty"},
                           {50, "fifty"},
                           {60, "sixty"},
                           {70, "seventy"},
                           {80, "eighty"},
                           {90, "ninety"},
                           {100, "one hundred"},
                           {200, "two hundred"},
                           {300, "three hundred"},
                           {400, "four hundred"},
                           {500, "five hundred"},
                           {600, "six hundred"},
                           {700, "seven hundred"},
                           {800, "eight hundred"},
                           {900, "nine hundred"},
                           {1000, "one thousand"},
                       };

            for (var number = 1; number <= 1000; number++)
            {
                if (dict.ContainsKey(number)) continue;

                var divisor = number < 100 ? 10 : 100;
                var separator = divisor == 100 ? " and " : "-";

                var key = (number / divisor) * divisor;
                var mod = number % divisor;
                dict.Add(number, dict[key] + separator + dict[mod]);
            }
        }
    }
}

Ответы [ 2 ]

3 голосов
/ 06 января 2012

Используйте ListBox.ItemContainerStyle, чтобы установить HorizontalContentAlignment для ListBoxItems на Right.

<ListBox.ItemContainerStyle>
    <Style TargetType="{x:Type ListBoxItem}">
        <Setter Property="HorizontalContentAlignment" Value="Right"/>
    </Style>
</ListBox.ItemContainerStyle>

Примечание: Это отличается от установки HorizontalAlignment тем, что элементы будут по-прежнему охватывать ListBox, что влияет на выбор элемента.

0 голосов
/ 06 января 2012

Настройка HorizontalAlignment на панели стека работает для меня.

<ItemsPanelTemplate>
    <StackPanel HorizontalAlignment="Right"/>
</ItemsPanelTemplate>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...