Переопределение измерения макета элемента не должно возвращать PositiveInfinity как его DesiredSize, даже если бесконечность передана как доступный размер - PullRequest
1 голос
/ 10 ноября 2011

Итак, я пытаюсь реализовать простой Kerning UserControl для использования с текстом DataBound в ListBoxTemplate, и я получаю сообщение об ошибке, которое содержится в заголовке этого отчета. Я пытался решить эту проблему в течение нескольких часов без удачи. Я использую данные времени разработки для заполнения данных во время разработки в VS или Expression Blend, но я не уверен, является ли это причиной при ее создании, и происходит сбой только при заполнении данных.

<ListBox
            x:Name="MainList"
            ItemsSource="{Binding FeedItems}"
            SelectionChanged="ListBox_SelectionChanged"
            >
            <ListBox.ItemTemplate>

                <DataTemplate>
                    <StackPanel Orientation="Horizontal" x:Uid="{Binding ItemLink}" Margin="10">
                        <Controls:KerningTextBlock
                        Spacing="2"
                        Font="Verdana"
                        VerticalAlignment="Center"
                        HorizontalAlignment="Left"
                        FontSize="32"
                        InputText="{Binding ItemTitle}"/>

                ....

    private StackPanel Stack = new StackPanel()
    {
        FlowDirection = System.Windows.FlowDirection.LeftToRight,
        Orientation = System.Windows.Controls.Orientation.Horizontal
    };

    private void KernIt()
    {
        // Clear the contents
        this.LayoutRoot.Children.Clear();

        // Convert input string to character array
        char[] Letters = !string.IsNullOrEmpty(this.InputText)? this.InputText.ToCharArray() : " ".ToCharArray();

        // For each item create a new text block with the following test
        foreach (var letter in Letters)
        {
            // Set up the formatted text block
            TextBlock TempText = new TextBlock();
            TempText.FontFamily = new FontFamily(this.Font);
            TempText.FontSize = 30;
            TempText.Padding = new Thickness(0, 0, this.Spacing, 0);
            TempText.Text = letter.ToString();

            // Add to the stack
            Stack.Children.Add(TempText);
        }
        // Add to the grid
        if (Stack.Children.Count() > 0)
            this.LayoutRoot.Children.Add(Stack);
    }

    public string InputText { get; set; }
    public double Spacing { get; set;}
    public string Font { get; set; }

1 Ответ

1 голос
/ 10 ноября 2011

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

DataContext="{Binding}"

Затем установите корень Layout следующим образом, поскольку я очищаю LayoutRoot (который теперь нужно изменить на SubRoot.Children.Clear ():

<Grid x:Name="LayoutRoot" >
    <TextBlock x:Name="Title" Text="{Binding ItemTitle}"/>
    <Grid x:Name="SubRoot">
    </Grid>
</Grid>

Далее в коде добавить добавленное событие:

public KerningTextBlock()
{
    UpdateLayout();
    InitializeComponent();
    this.Loaded += new RoutedEventHandler(KerningTextBlock_Loaded);
}
 void KerningTextBlock_Loaded(object sender, RoutedEventArgs e)
{
     if (string.IsNullOrEmpty(Title.Text))
        this.InputText = "why am I empty?";
    else
        this.InputText = Title.Text;
    KernIt();
}

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

<Controls:KerningTextBlock
    DataContext="{Binding}"
    Spacing="5"
    Font="Verdana"
    x:Name="Button_Name"
    Margin="135,5,15,0"
    VerticalAlignment="Center"
    HorizontalAlignment="Left"
    FontSize="32"/>
...