Как динамически изменить фоновое изображение полосы прокрутки в WPF? - PullRequest
0 голосов
/ 31 декабря 2018

Этот вопрос жестоко сложно задавать ясным образом.Но я буду стараться изо всех сил ...

В заголовке "фон полосы прокрутки" означает область дорожки, как показано на следующем изображении (явно украдено у https://www.codeproject.com/Articles/41787/Creating-a-Blend-like-Scrollbar).

Части полосы прокрутки

По-видимому, stackoverflow не позволяет мне вставлять изображения. Поэтому я надеюсь, что приведенная выше ссылка работает.

Кроме того, слово "динамически" в заголовкеэто не означает замену одного изображения ресурса другим. Это означает создание изображения в памяти и назначение его полосе прокрутки во время выполнения.

Я собрал простой проект, чтобы продемонстрировать, что я пытаюсь сделать.Вот снимок экрана.

Снимок экрана с желаемым эффектом

Подождите! Стоп. Пожалуйста, не предлагайте "обрабатывать" приложение стороннего производителя, например Winmerge или что-то еще.Помните, что это всего лишь демонстрационное приложение, которое поможет донести идею. Мое настоящее приложение не сравнивает текстовые файлы, хотя конечный результат будет очень похожим.

Вот немного XAML моего демонстрационного приложения.

<Grid>
    <DataGrid Name="dgDiffs" AutoGenerateColumns="False">
        <DataGrid.Resources>
            <Style TargetType="ScrollBar">
                <Setter Property="Background">
                    <Setter.Value>
                        <!--<ImageBrush ImageSource="{Binding overview}" />-->
                        <ImageBrush ImageSource="overview.png" />
                    </Setter.Value>

AsВы можете видеть, я жестко запрограммировал изображение для демонстрации (Overview.png).Вы также можете увидеть, где я пытался привязать источник изображения к объекту в C #.Идея состоит в том, что я программно создаю растровое изображение, показывающее обзор, а затем обновляю полосу прокрутки.

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

Вот мой демонстрационный код, пытающийся использовать растровый объект.

public partial class MainWindow : Window {

    class DiffItem {
        public int diff { get; set; } // used to color grid row (highlight differences)
        public string leftString { get; set; }
        public string rightString { get; set; }
    }

    public MainWindow() {
        InitializeComponent();

        // build a lengthy list for demonstration
        List<DiffItem> diffList = new List<DiffItem>();
        for (int i = 0; i < 10; i++) {
            // I've chopped out a bunch of lines here. This just builds a long repeating list for the demo
            diffList.Add(new DiffItem() { diff = 0, leftString = "one", rightString = "one" });
            diffList.Add(new DiffItem() { diff = -1, leftString = "four", rightString = "" });
            diffList.Add(new DiffItem() { diff = 1, leftString = "", rightString = "eight" });
            diffList.Add(new DiffItem() { diff = 2, leftString = "eleven", rightString = "elven" });
            diffList.Add(new DiffItem() { diff = 0, leftString = "sixteen", rightString = "sixteen" });
        }

        // display list
        dgDiffs.ItemsSource = diffList;

        // update scrollbar overview
        Bitmap overview = new Bitmap(20, 200);
        using (Graphics g = Graphics.FromImage(overview)) {
            g.Clear(Color.Green);
        }
    }
}

А вот XAML, пытающийся связать изображение полосы прокруткиисточник.

<Grid>
    <DataGrid Name="dgDiffs" AutoGenerateColumns="False">
        <DataGrid.Resources>
            <Style TargetType="DataGridRow">
                <Style.Triggers>
                    <DataTrigger Binding="{Binding diff}" Value="2">
                        <Setter Property="Background" Value="Orange" />
                    </DataTrigger>
                    <DataTrigger Binding="{Binding diff}" Value="1">
                        <Setter Property="Background" Value="LightGreen" />
                    </DataTrigger>
                    <DataTrigger Binding="{Binding diff}" Value="-1">
                        <Setter Property="Background" Value="OrangeRed" />
                    </DataTrigger>
                </Style.Triggers>
            </Style>
            <Style TargetType="ScrollBar">
                <Setter Property="Background">
                    <Setter.Value>
                        <ImageBrush ImageSource="{Binding overview}" />
                        <!--<ImageBrush ImageSource="overview.png" />-->
                    </Setter.Value>
                </Setter>
            </Style>
        </DataGrid.Resources>
        <DataGrid.Columns>
            <DataGridTextColumn Binding="{Binding leftString}" Width="200"></DataGridTextColumn>
            <DataGridTextColumn Binding="{Binding rightString}" Width="*"></DataGridTextColumn>
        </DataGrid.Columns>
    </DataGrid>
</Grid>

1 Ответ

0 голосов
/ 01 января 2019

Если кому-то интересно ... вот как это сделать.

XAML

<Grid>
    <DataGrid Name="dgDiffs" AutoGenerateColumns="False">
        <DataGrid.Resources>
            <Style TargetType="DataGridRow">
                <Style.Triggers>
                    <DataTrigger Binding="{Binding diff}" Value="2">
                        <Setter Property="Background" Value="Orange" />
                    </DataTrigger>
                    <DataTrigger Binding="{Binding diff}" Value="1">
                        <Setter Property="Background" Value="LightGreen" />
                    </DataTrigger>
                    <DataTrigger Binding="{Binding diff}" Value="-1">
                        <Setter Property="Background" Value="OrangeRed" />
                    </DataTrigger>
                </Style.Triggers>
            </Style>
            <Style TargetType="ScrollBar">
                <Setter Property="Background">
                    <Setter.Value>
                        <ImageBrush ImageSource="{Binding Path=overview}" />
                        <!--<ImageBrush ImageSource="overview.png" />-->
                    </Setter.Value>
                </Setter>
            </Style>
        </DataGrid.Resources>
        <DataGrid.Columns>
            <DataGridTextColumn Binding="{Binding leftString}" Width="200"></DataGridTextColumn>
            <DataGridTextColumn Binding="{Binding rightString}" Width="*"></DataGridTextColumn>
        </DataGrid.Columns>
    </DataGrid>
</Grid>

C #

public partial class MainWindow : Window {

    class DiffItem {
        public int diff { get; set; } // used to color grid row (highlight differences)
        public string leftString { get; set; }
        public string rightString { get; set; }
    }

    public BitmapImage overview { get; set; }

    public MainWindow() {
        InitializeComponent();
        DataContext = this;

        // build a lengthy list for demonstration
        List<DiffItem> diffList = new List<DiffItem>();
        for (int i = 0; i < 10; i++) {
            diffList.Add(new DiffItem() { diff = 0, leftString = "one", rightString = "one" });
            diffList.Add(new DiffItem() { diff = 0, leftString = "two", rightString = "two" });
            diffList.Add(new DiffItem() { diff = 0, leftString = "three", rightString = "three" });
            diffList.Add(new DiffItem() { diff = -1, leftString = "four", rightString = "" });
            diffList.Add(new DiffItem() { diff = 0, leftString = "five", rightString = "five" });
            diffList.Add(new DiffItem() { diff = 0, leftString = "six", rightString = "six" });
            diffList.Add(new DiffItem() { diff = 0, leftString = "seven", rightString = "seven" });
            diffList.Add(new DiffItem() { diff = 1, leftString = "", rightString = "eight" });
            diffList.Add(new DiffItem() { diff = 0, leftString = "nine", rightString = "nine" });
            diffList.Add(new DiffItem() { diff = 0, leftString = "ten", rightString = "ten" });
            diffList.Add(new DiffItem() { diff = 2, leftString = "eleven", rightString = "elven" });
            diffList.Add(new DiffItem() { diff = 2, leftString = "twelv", rightString = "twelve" });
            diffList.Add(new DiffItem() { diff = 0, leftString = "thirteen", rightString = "thirteen" });
            diffList.Add(new DiffItem() { diff = 0, leftString = "fourteen", rightString = "fourteen" });
            diffList.Add(new DiffItem() { diff = 0, leftString = "fifteen", rightString = "fifteen" });
            diffList.Add(new DiffItem() { diff = 0, leftString = "sixteen", rightString = "sixteen" });
        }

        // display list
        dgDiffs.ItemsSource = diffList;

        // create the overview bitmap
        Bitmap bmp = new Bitmap(20, 200, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
        using (Graphics g = Graphics.FromImage(bmp)) {
            Pen greenPen = new Pen(Color.Green, 1);
            g.Clear(Color.White);
            g.DrawLine(greenPen, 0, 50, 20, 50);
        }
        MemoryStream memoryStream = new MemoryStream();
        bmp.Save(memoryStream, System.Drawing.Imaging.ImageFormat.Bmp);

        // load scrollbar with overview
        overview = new BitmapImage();
        overview.BeginInit();
        overview.StreamSource = memoryStream;
        overview.EndInit();
        overview.Freeze();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...