Программная установка VisualStateGroups для ColumnHeader приводит к странной анимации.C#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Программная установка VisualStateGroups для ColumnHeader приводит к странной анимации.

Сообщение Anonymous »

Во-первых, я не очень хорошо знаком с WPF, поэтому прошу прощения, если это очевидная проблема, которую я просто не понимаю.
Я пытаюсь программно установить ColumnHeaderStyle для WorkbookView и я испытываю странное поведение: заголовки столбцов не обновляются/устанавливаются правильно. Когда я создаю тот же стиль в XAML, он работает безупречно, как и предполагалось, но, насколько я могу судить, я не могу динамически изменять/обновлять функцию Converter для ColumnHeader при изменении ActiveTab.
Моим решением было просто создать стиль программно, чтобы я мог передать объект, который будет определять, как будет установлен текст для столбцов, но когда я это делаю, я испытываю странное поведение, и мои заголовки столбцов, похоже, обновляются только иногда. и будет только слева от самого правого выбранного столбца, но даже в этом случае обновление происходит очень спорадически.
CommonStates VisualStatesGroup, кажется, работает так, как ожидалось, но я не могу этого сделать заставить SelectionStates вести себя правильно.
Я не уверен, почему MouseOver/Normal работает правильно, но SelectionStates, по-видимому, имеет неопределенное поведение, если установлено программно. Я включил как можно меньше кода, чтобы показать, с чем имею дело.
Я думаю, думаю, что код-нарушитель, препятствующий правильному запуску анимации это код из моего C# (полный блок кода далее после XAML):
gridFactory.AddHandler(FrameworkElement.LoadedEvent, new RoutedEventHandler((s, e) =>
{
VisualStateManager.GetVisualStateGroups((Grid)s).Add(commonStates);
VisualStateManager.GetVisualStateGroups((Grid)s).Add(selectionStates);
}));

Это мой текущий XAML (я отключил ссылку на стиль XAML для WorkbookView, я оставил стиль там, чтобы объяснить, чего я пытаюсь достичь):
р>
















































using SpreadsheetGear.Windows.Controls;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;

namespace SSGBug
{
///
/// Interaction logic for MainWindow.xaml
///
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
workbookView.ActiveTabChanged += WorkbookView_ActiveTabChanged;
}

private void WorkbookView_ActiveTabChanged(object sender, SpreadsheetGear.Windows.Controls.ActiveTabChangedEventArgs e)
{
workbookView.ColumnHeaderStyle = CustomStyles.CreateMyCustomColumnHeaderStyle();
}
}

public class ColumnHeaderTextConverter : System.Windows.Data.IValueConverter
{
public object Convert(object value, System.Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
return "This will be a function call";
}

public object ConvertBack(object value, System.Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
// Not used.
throw new System.NotImplementedException();
}
}

public class CustomStyles
{
public static Style CreateMyCustomColumnHeaderStyle()
{
Style style = new(typeof(ColumnHeader));

// Create the ControlTemplate
ControlTemplate controlTemplate = new(typeof(ColumnHeader));

// Define the Grid
FrameworkElementFactory gridFactory = new(typeof(Grid))
{
Name = "Root"
};

// Define the BackgroundRectangle
FrameworkElementFactory backgroundRectangleFactory = new(typeof(Rectangle))
{
Name = "BackgroundRectangle"
};
backgroundRectangleFactory.SetValue(Shape.FillProperty, new SolidColorBrush(System.Windows.Media.Color.FromRgb(0xF2, 0xF2, 0xF2)));
backgroundRectangleFactory.SetValue(Shape.StretchProperty, Stretch.Fill);

// Define the Border
FrameworkElementFactory borderFactory = new(typeof(Border));
borderFactory.SetValue(Border.BorderThicknessProperty, new Thickness(0, 0, 1, 1));
borderFactory.SetValue(Border.BorderBrushProperty, new SolidColorBrush(System.Windows.Media.Color.FromRgb(0x68, 0x8C, 0xAF)));

// Define the TextBlock
FrameworkElementFactory textBlockFactory = new(typeof(TextBlock));
textBlockFactory.SetValue(TextBlock.HorizontalAlignmentProperty, HorizontalAlignment.Center);
textBlockFactory.SetValue(TextBlock.VerticalAlignmentProperty, VerticalAlignment.Center);
Binding binding = new("ColumnIndex")
{
RelativeSource = new RelativeSource(RelativeSourceMode.FindAncestor, typeof(ColumnHeader), 1),
// This is supposed to take a param but I removed that logic for this demo
Converter = new ColumnHeaderTextConverter()
};
textBlockFactory.SetBinding(TextBlock.TextProperty, binding);

// Add children to the Grid
gridFactory.AppendChild(backgroundRectangleFactory);
gridFactory.AppendChild(borderFactory);
gridFactory.AppendChild(textBlockFactory);

controlTemplate.VisualTree = gridFactory;

// Create the VisualStateGroups
#region Common States
VisualStateGroup commonStates = new() { Name = "CommonStates" };
#region Normal State
VisualState normalState = new() { Name = "Normal" };
Storyboard normalStoryboard = new();
ColorAnimation normalColorAnimation = new()
{
Duration = new Duration(TimeSpan.Zero),
//To = System.Windows.Media.Color.FromRgb(0xF2, 0xF2, 0xF2)
// Making this black for now to make it obvious
To = System.Windows.Media.Color.FromRgb(0x00, 0x00, 0x00)
};
Storyboard.SetTargetName(normalColorAnimation, "BackgroundRectangle");
Storyboard.SetTargetProperty(normalColorAnimation, new PropertyPath("(Fill).Color"));
normalStoryboard.Children.Add(normalColorAnimation);
normalState.Storyboard = normalStoryboard;
#endregion
#region Mouse Over
VisualState mouseOverState = new() { Name = "MouseOver" };
Storyboard mouseOverStoryboard = new();
ColorAnimation mouseOverColorAnimation = new()
{
Duration = new Duration(TimeSpan.Zero),
To = System.Windows.Media.Color.FromRgb(0xB7, 0xE7, 0xFB)
};
Storyboard.SetTargetName(mouseOverColorAnimation, "BackgroundRectangle");
Storyboard.SetTargetProperty(mouseOverColorAnimation, new PropertyPath("(Fill).Color"));
mouseOverStoryboard.Children.Add(mouseOverColorAnimation);
mouseOverState.Storyboard = mouseOverStoryboard;
#endregion
commonStates.States.Add(normalState);
commonStates.States.Add(mouseOverState);
#endregion

#region Selection States
VisualStateGroup selectionStates = new() { Name = "SelectionStates" };
#region Unselected
VisualState unselectedState = new() { Name = "Unselected" };
Storyboard unselectedStoryboard = new();
ColorAnimation unselectedColorAnimation = new()
{
Duration = new Duration(TimeSpan.Zero),
To = System.Windows.Media.Color.FromRgb(0x00, 0x00, 0x00)
};
Storyboard.SetTargetName(unselectedColorAnimation, "BackgroundRectangle");
Storyboard.SetTargetProperty(unselectedColorAnimation, new PropertyPath("(Fill).Color"));
unselectedStoryboard.Children.Add(unselectedColorAnimation);
unselectedState.Storyboard = unselectedStoryboard;
#endregion
#region Selected
VisualState selectedState = new() { Name = "Selected" };
Storyboard selectedStoryboard = new();
ColorAnimation selectedColorAnimation = new()
{
Duration = new Duration(TimeSpan.Zero),
To = System.Windows.Media.Color.FromRgb(0xB7, 0xE7, 0xFB)
};
Storyboard.SetTargetName(selectedColorAnimation, "BackgroundRectangle");
Storyboard.SetTargetProperty(selectedColorAnimation, new PropertyPath("(Fill).Color"));
selectedStoryboard.Children.Add(selectedColorAnimation);
selectedState.Storyboard = selectedStoryboard;
#endregion
selectionStates.States.Add(unselectedState);
selectionStates.States.Add(selectedState);
#endregion

// I think this is what isn't working correctly?
// Add VisualStateGroups to the template
gridFactory.AddHandler(FrameworkElement.LoadedEvent, new RoutedEventHandler((s, e) =>
{
VisualStateManager.GetVisualStateGroups((Grid)s).Add(commonStates);
VisualStateManager.GetVisualStateGroups((Grid)s).Add(selectionStates);
}));

// Set the control template
style.Setters.Add(new Setter(Control.TemplateProperty, controlTemplate));

return style;
}
}
}


Подробнее здесь: https://stackoverflow.com/questions/787 ... -weird-ani
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»