Попробуйте поместить document.getElementById
в setTimeout()
Например.
setTimeout(function(){
console.log(document.getElementById('whatever'));
}, 100);
Если это сработает, тогда это просто проблема синхронизации.
Если вы хотите использовать Grid
, вам нужно изменить ColumnDefinition
s следующим образом:
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
Если вам не нужно использовать Grid
, тогда вы можете использовать DockPanel
:
<DockPanel>
<WrapPanel DockPanel.Dock="Left">
<!--Some content here-->
<TextBlock Text="{Binding Path=LastName}" TextWrapping="Wrap" FontSize="24"/>
<TextBlock Text=", " TextWrapping="Wrap" FontSize="24"/>
<TextBlock Text="{Binding Path=FirstName}" TextWrapping="Wrap" FontSize="24"/>
</WrapPanel>
<ListBox DockPanel.Dock="Right" ItemsSource="{Binding Path=PhoneNumbers}"
Margin="8,0" Background="Transparent" BorderBrush="Transparent" IsHitTestVisible="False"/>
<TextBlock />
</DockPanel>
Обратите внимание на TextBlock
в конце. Любой элемент управления без определения "DockPanel.Dock"
заполнит оставшееся пространство.
Ответ Тэке работает хорошо, и, как ответ ванкутерромни, вы можете отключить горизонтальную полосу прокрутки, чтобы избавиться от несоответствия раздражающего размера. Однако, если вы хотите, чтобы лучшее из обоих миров, - чтобы удалить полосу прокрутки, когда она не нужна, но автоматически включается, когда ListBox становится слишком маленьким, вы можете использовать следующий конвертер:
/// <summary>
/// Value converter that adjusts the value of a double according to min and max limiting values, as well as an offset. These values are set by object configuration, handled in XAML resource definition.
/// </summary>
[ValueConversion(typeof(double), typeof(double))]
public sealed class DoubleLimiterConverter : IValueConverter
{
/// <summary>
/// Minimum value, if set. If not set, there is no minimum limit.
/// </summary>
public double? Min { get; set; }
/// <summary>
/// Maximum value, if set. If not set, there is no minimum limit.
/// </summary>
public double? Max { get; set; }
/// <summary>
/// Offset value to be applied after the limiting is done.
/// </summary>
public double Offset { get; set; }
public static double _defaultFailureValue = 0;
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value == null || !(value is double))
return _defaultFailureValue;
double dValue = (double)value;
double minimum = Min.HasValue ? Min.Value : double.NegativeInfinity;
double maximum = Max.HasValue ? Max.Value : double.PositiveInfinity;
double retVal = dValue.LimitToRange(minimum, maximum) + Offset;
return retVal;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
Затем определите его в XAML в соответствии с желаемыми значениями max / min, а также смещением для устранения этого раздражающего несоответствия в размере 2 пикселя, как указано в других ответах:
<ListBox.Resources>
<con:DoubleLimiterConverter x:Key="conDoubleLimiter" Min="450" Offset="-2"/>
</ListBox.Resources>
Затем используйте конвертер в привязке Width:
<Grid.Width>
<Binding Path="ActualWidth" RelativeSource="{RelativeSource Mode=FindAncestor, AncestorType={x:Type ScrollContentPresenter}}" Converter="{StaticResource conDoubleLimiter}" />
</Grid.Width>
Grid
должен по умолчанию принимать всю ширину ListBox
, потому что по умолчанию ItemsPanel
для него VirtualizingStackPanel
. Я предполагаю, что вы не изменили ListBox.ItemsPanel
.
Возможно, если вы избавились от середины ColumnDefinition
(остальные по умолчанию "*"
) и поместите HorizontalAlignment="Left"
на ваш WrapPanel
и HorizontalAlignment="Right"
на ListBox
для телефонных номеров. Возможно, вам придется немного изменить это ListBox
, чтобы получить номера телефонов с еще большим выравниванием по правому краю, например, для них DataTemplate
.
Метод в ответе Тэке заставляет горизонтальную полосу прокрутки. Это можно устранить, добавив конвертер, чтобы уменьшить ширину сетки по ширине элемента управления вертикальной полосой прокрутки.
using System;
using System.Globalization;
using System.Windows;
using System.Windows.Data;
using System.Windows.Markup;
namespace Converters
{
public class ListBoxItemWidthConverter : MarkupExtension, IValueConverter
{
private static ListBoxItemWidthConverter _instance;
#region IValueConverter Members
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return System.Convert.ToInt32(value) - SystemParameters.VerticalScrollBarWidth;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
#endregion
public override object ProvideValue(IServiceProvider serviceProvider)
{
return _instance ?? (_instance = new ListBoxItemWidthConverter());
}
}
}
Добавить пространство имен в корневой узел вашего XAML.
xmlns:converters="clr-namespace:Converters"
И обновите ширину сетки, чтобы использовать конвертер.
<Grid.Width>
<Binding Path="ActualWidth" RelativeSource="{RelativeSource Mode=FindAncestor, AncestorType={x:Type ScrollContentPresenter}}" Converter="{converters:ListBoxItemWidthConverter}"/>
</Grid.Width>
HorizontalContentAlignment="Stretch"
в элементе списка элемент i> в списке, который вы делаете через ListBox.ItemContainerStyle
.
– Ed Plunkett
23 June 2017 в 19:29
<controls:Pivot.ItemTemplate><DataTemplate /></controls:Pivot.ItemTemplate>
). Но где я должен поместить этот код? Я пробовал некоторые, но я не мог понять это. – SynerCoder 4 October 2012 в 16:30ItemsControl
– Simon_Weaver 23 January 2017 в 10:59