Непредсказуемое изменение стиля с помощью поведения XAML (управляемого) в UWP - PullRequest
0 голосов
/ 26 июня 2018

Я использую пакет Microsoft.Xaml.Behaviors.Uwp.Managed NuGet для управления поведением в моем приложении UWP C #. У меня есть ListView с пользовательским шаблоном данных, как это:

Пункт:

<ListView 
ItemTemplate="{StaticResource ListViewMessageTemplate_Assistant}" x:Name="MessengerView"
 BorderThickness="2,2,2,2" SelectionMode="None" Margin="10,10,10,10" IsMultiSelectCheckBoxEnabled="False" ScrollViewer.HorizontalScrollBarVisibility="Auto"  
 IsDoubleTapEnabled="False" IsHoldingEnabled="False"
 IsRightTapEnabled="False" IsTapEnabled="False" ContainerContentChanging="MessengerView_ContainerContentChanging" ScrollViewer.VerticalScrollBarVisibility="Auto"/>

Шаблон данных:

   <DataTemplate x:Key="ListViewMessageTemplate_Assistant">
        <Grid x:Name="MainGrid"  MaxWidth="500" Margin="10,0,10,10">
            <Grid.ColumnDefinitions>

                <ColumnDefinition Width="Auto"></ColumnDefinition>
                <ColumnDefinition Width="*"></ColumnDefinition>

            </Grid.ColumnDefinitions>

            <Grid.RowDefinitions>
                <RowDefinition Height="Auto"></RowDefinition>
                <RowDefinition Height="*"></RowDefinition>
            </Grid.RowDefinitions>


            <Rectangle x:Name="BackRect" Grid.ColumnSpan="2" HorizontalAlignment="Stretch" Grid.RowSpan="2" VerticalAlignment="Stretch" RadiusX="20" RadiusY="20">
                <Rectangle.Fill>
                    <SolidColorBrush Color="{StaticResource Amazonite}"/>
                </Rectangle.Fill>
                <interactivity:Interaction.Behaviors>
                    <core:DataTriggerBehavior x:Name="IsClient" Binding="{Binding Message_style}" ComparisonCondition="Equal" Value="0">
                        <core:ChangePropertyAction x:Name="Blue" PropertyName="Fill" TargetObject="{Binding ElementName=BackRect}" Value="{StaticResource Cola Blue}"/>
                    </core:DataTriggerBehavior>

                    <core:DataTriggerBehavior x:Name="NotIncludesData" Binding="{Binding Message_style}" ComparisonCondition="Equal" Value="1">
                        <core:ChangePropertyAction x:Name="Red" PropertyName="Fill" TargetObject="{Binding ElementName=BackRect}" Value="{StaticResource Crimson Red}"/>
                    </core:DataTriggerBehavior>


                    <core:DataTriggerBehavior x:Name="IsResultBalloon" Binding="{Binding Message_style}" ComparisonCondition="Equal" Value="2">
                        <core:ChangePropertyAction x:Name="Yellow" PropertyName="Fill" TargetObject="{Binding ElementName=BackRect}" Value="{StaticResource American Orange}"/>
                    </core:DataTriggerBehavior>
                </interactivity:Interaction.Behaviors>


            </Rectangle>

            <TextBlock x:Name="MessageText" HorizontalAlignment="Stretch" Margin="20,20,20,20"  TextWrapping="Wrap" VerticalAlignment="Stretch" Text="{Binding Message}" Grid.Row="1" RequestedTheme="Default" Grid.ColumnSpan="2"/>
            <TextBlock x:Name="UserText" HorizontalAlignment="Stretch" Margin="10,10,5,0"  TextWrapping="Wrap" VerticalAlignment="Stretch" Text="{Binding User}" Style="{StaticResource CaptionTextBlockStyle}" FontWeight="Bold" RequestedTheme="Default"/>
            <TextBlock x:Name="DateText" HorizontalAlignment="Stretch" Margin="5,10,10,0"  TextWrapping="Wrap" VerticalAlignment="Stretch" Text="{Binding Message_Time}" Grid.Column="1" TextAlignment="Center" Style="{StaticResource CaptionTextBlockStyle}" FontWeight="Bold" RequestedTheme="Default"/>
        </Grid>
    </DataTemplate>

Как вы видите в коде xaml, цвет прямоугольника меняет свой цвет в зависимости от заданного целочисленного значения, например:

 MessengerView.Items.Add(new MessageBaloon(("Hello", usr: MessageSender.Assistant, 3))); // Print the result.
 class MessageBaloon
    {
        /// <summary>
        /// Message sender enum types.
        /// </summary>
        public enum MessageSender
        {
            Client,
            Assistant
        }
        private string message;

        private MessageSender message_sender;

        private string message_time;

        private int message_style;



        /// <summary>
        /// Message.
        /// </summary>
        public string Message { get => message; }
        /// <summary>
        /// Get user.
        /// </summary>
        public MessageSender User { get => message_sender; }
        /// <summary>
        /// Time.
        /// </summary>
        public string Message_Time { get => message_time; }
        /// <summary>
        /// Determines message style. 0 for client, 1 for no data from assistant, 2 result from assistant, 3 for normal assistant prompt.
        /// </summary>
        public int Message_style { get => message_style; set => message_style = value; }

        /// <summary>
        /// Creating a message baloon for chat UI based on given datas.
        /// </summary>
        /// <param name="msg">Message string.</param>
        /// <param name="usr">User type. Use MessageSender enum please.</param>
        /// <param name="style_number">  Determines message style. 0 for client, 1 for no data from assistant, 2 result from assistant, 3 for normal assistant prompt. </param>

        public MessageBaloon(string msg, MessageSender usr, int style_number )
        {
            message = msg;
            message_sender = usr;
            message_time = DateTime.Now.ToString();
            message_style = style_number;


        }
    }

First image.

Second image.

Тем не менее, цвета смешивались с помощью управления поведением некоторое время, как вы видели в этом тексте ... Например; если цвет сообщения должен быть светло-бирюзовым в зависимости от значения привязки, то некоторое время он становится синим без вмешательства кода. Можете ли вы помочь мне выяснить, что является причиной этой проблемы? Спасибо.

1 Ответ

0 голосов
/ 27 июня 2018

Добавление этого поведения в шаблон, похоже, решает проблему. Раньше я не использовал триггер для цвета чирка, потому что я думаю, что это цвет фона шаблона по умолчанию, и он не изменится, если не возникнут другие условия.

  <core:DataTriggerBehavior x:Name="IsAssistant" Binding="{Binding Message_style}" ComparisonCondition="Equal" Value="3">
                    <core:ChangePropertyAction x:Name="Green" PropertyName="Fill" TargetObject="{Binding ElementName=BackRect}" Value="{StaticResource Amazonite}"/>
                </core:DataTriggerBehavior>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...