Можно ли привязать цвет переднего плана любого textcontrol - PullRequest
0 голосов
/ 11 мая 2018

Итак, я пытался понять это в течение 3 дней, и я просто не могу найти решение.

Это то, чего я пытаюсь достичь. У меня есть простой проект WPF с RichTextBox в нем. Что делает мое приложение, так это то, что оно действует как CMD.

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

Вот GIF-файл, показывающий, как он выглядит https://i.imgur.com/srszUKG.gifv

Я пытался связать Foreground из TextBox внутри DataTemplate, но это просто привело к тому, что текст даже не отобразился.

<DataTemplate>
                            <TextBlock Text="{Binding Path=.}" Foreground="White" Name="SavedBlocks" FontFamily="Consolas"/>
                        </DataTemplate>

Итак, какие у меня есть варианты, я хочу изменить цвет текста в зависимости от длины сообщения.

1019 * XAML *

<Window x:Class="WpfApp1Eh.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApp1Eh"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <ScrollViewer Name="Scroller" Margin="0" Background="Black">
            <StackPanel>
                <ItemsControl ItemsSource="{Binding ConsoleOutput, Mode=OneWay}">
                    <ItemsControl.ItemTemplate>
                        <DataTemplate>
                            <TextBlock Text="{Binding Path=.}" Foreground="White" Name="SavedBlocks" FontFamily="Consolas"/>
                        </DataTemplate>
                    </ItemsControl.ItemTemplate>
                </ItemsControl>
                <TextBox Text="{Binding ConsoleInput, Mode=TwoWay}" Background="Black" Foreground="White" FontFamily="Consolas" Name="InputBlock" BorderBrush="{x:Null}" SelectionBrush="{x:Null}" />
            </StackPanel>
        </ScrollViewer>
    </Grid>
</Window>

main.cs

public partial class MainWindow : Window
    {
        ConsoleContent dc = new ConsoleContent();
        public MainWindow()
        {
            InitializeComponent();
            Loaded += MainWindow_Loaded1;
            DataContext = dc;
        }

        private void MainWindow_Loaded1(object sender, RoutedEventArgs e)
        {
            InputBlock.KeyDown += InputBlock_KeyDown;
            InputBlock.Focus();
        }

        void InputBlock_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.Key == Key.Enter)
            {
                dc.ConsoleInput = InputBlock.Text;
                dc.RunCommand();
                InputBlock.Focus();
                Scroller.ScrollToBottom();

            }
        }
    }

ConsoleContent.cs

public class ConsoleContent : INotifyPropertyChanged
{
    string consoleInput = string.Empty;
    ObservableCollection<string> consoleOutput = new ObservableCollection<string>() { "Console Emulation Sample..." };

    public string ConsoleInput
    {
        get
        {
            return consoleInput;
        }
        set
        {
            consoleInput = value;
            OnPropertyChanged("ConsoleInput");
        }
    }

    public ObservableCollection<string> ConsoleOutput
    {
        get
        {
            return consoleOutput;
        }
        set
        {
            consoleOutput = value;
            OnPropertyChanged("ConsoleOutput");
        }
    }

    public void RunCommand()
    {
        ConsoleOutput.Add(ConsoleInput);
        //myBrush = Brushes.Orange;
        // do your stuff here.
        ConsoleInput = String.Empty;
    }



    private System.Windows.Media.Brush _foregroundColor = System.Windows.Media.Brushes.DarkSeaGreen;

    public System.Windows.Media.Brush ForegroundColor
    {
        get { return _foregroundColor; }
        set
        {
            _foregroundColor = value;
            OnPropertyChanged("ForegroundColor");
        }
    }


    public event PropertyChangedEventHandler PropertyChanged;
    void OnPropertyChanged(string propertyName)
    {
        if (null != PropertyChanged)
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }
}

1 Ответ

0 голосов
/ 11 мая 2018

Измените тип consoleOutput с ObservableCollection<string> на ObservableCollection<YourType>, где YourType - это класс, представляющий строку ввода с текстом string и передним планом Brush:

public class YourType : INotifyPropertyChanged
{
    private string _text;
    public string Text
    {
        get { return _text; }
        set { _text = value; OnPropertyChanged("Text"); }
    }

    private Brush _foreground;
    public Brush Foreground
    {
        get { return _foreground; }
        set { _foreground = value; OnPropertyChanged("Foreground"); }
    }

    public event PropertyChangedEventHandler PropertyChanged;
    void OnPropertyChanged(string propertyName)
    {
        if (null != PropertyChanged)
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }
}

Привязка к свойствам этого класса в вашем XAML:

<ScrollViewer Name="Scroller" Margin="0" Background="Black">
    <StackPanel>
        <ItemsControl ItemsSource="{Binding ConsoleOutput, Mode=OneWay}">
            <ItemsControl.ItemTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding Text}" 
                               Foreground="{Binding Foreground}" 
                               Name="SavedBlocks" FontFamily="Consolas"/>
                </DataTemplate>
            </ItemsControl.ItemTemplate>
        </ItemsControl>
        <TextBox Text="{Binding ConsoleInput, Mode=TwoWay}" Background="Black" Foreground="White" FontFamily="Consolas" Name="InputBlock" BorderBrush="{x:Null}" SelectionBrush="{x:Null}" />
    </StackPanel>
</ScrollViewer>

Затем можно установить свойство Foreground каждого отдельного элемента в исходной коллекции:

public void RunCommand()
{
    ConsoleOutput.Add(new YourType { Text = ConsoleInput, Foreground = Brushes.Orange } );
    ConsoleInput = String.Empty;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...