Nano Hash - криптовалюты, майнинг, программирование

Как нарисовать прямоугольник из пользовательского ввода с помощью WPF

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

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

Вот мой XAML:

TextBox Text="{Binding xcoord, Mode=OneWay}" Name="x" Grid.Row="1" Height="20" Width="40" Grid.Column="2"></TextBox>

TextBox Text="{Binding ycoord, Mode=OneWay}" Name="y" Grid.Row="2" Height="20" Width="40" Grid.Column="2"></TextBox

Вот мой С#:

 public FEModel()
    {

        InitializeComponent();
        CreateARectangle();        

    }

private double xval;

public double xcoord
{
    get { return xval; }
}

private double yval;

public double ycoord
{
    get { return yval; }
}

public void CreateARectangle()
{
    // Creates a Rectangle  
    Rectangle rect = new Rectangle();
    rect.Height = ycoord;
    rect.Width = xcoord;
    // Create a Brush  
    SolidColorBrush colorbrush= new SolidColorBrush();
    colorbrush.Color = Colors.Red;
    colorbrush.Opacity = .3;
    SolidColorBrush blackBrush = new SolidColorBrush();
    blackBrush.Color = Colors.Black;
    // Set Rectangle's width and color  
    rect.StrokeThickness = 1;
    rect.Stroke = blackBrush;
    // Fill rectangle with color  
    rect.Fill =colorbrush;
    // Add Rectangle to the Grid.  
    can.Children.Add(rect);
}

Я ожидаю, что прямоугольник появится на холсте, как только пользователь введет координаты x и y, но вместо этого ничего не происходит.

10.06.2019

  • Есть ли у вас какие-либо обработчики событий в текстовых полях или там, где пользователи вводят значения? Также, пожалуйста, добавьте свой XAML :) 10.06.2019
  • Просто обновил его... пришлось удалить некоторые скобки, чтобы веб-сайт его распознал. Извините, я новичок, ха-ха. 10.06.2019
  • Как вы вызываете CreateARectangle? В любом случае я не вижу вашей проблемы в том, чтобы видеть, когда пользователи вводят что-то новое или когда меняются переменные. 10.06.2019
  • Только что обновил снова... извините... думал, что у меня есть вся необходимая информация там в первый раз. 10.06.2019
  • Почему свойства xcoord и ycoord доступны только для чтения? Добавьте сеттеры и вызовите в них метод CreateARectangle(). 10.06.2019
  • Итак, я сделал следующее: открытый частичный класс FEModel : Page { public double xval; общественный двойной yval; общественный двойной xcoord {получить {return xval; } установить {xcoord = xval; СоздатьПрямоугольник(); } } public double ycoord { get { return yval; } установить { yval = ycoord; СоздатьПрямоугольник(); } } Внутри холста по-прежнему ничего не появляется. 10.06.2019
  • Ваши привязки должны быть двухсторонними. 10.06.2019

Ответы:


1

Вам нужно использовать двустороннюю привязку для ваших текстовых полей.

Вот полностью рабочий образец.

Window Xaml: обратите внимание, что триггером обновления по умолчанию для текстового поля является LostFocus. В моем примере я установил «PropertyChanged», поэтому прямоугольник обновляется, как только пользователь меняет значение.

<Window x:Class="WpfApp9.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:WpfApp9"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
    <Grid Name="can">
        <TextBox Text="{Binding xcoord, UpdateSourceTrigger=PropertyChanged}" Name="x" Height="20" Width="40" Margin="40,51,0,0" HorizontalAlignment="Left" VerticalAlignment="Top"/>
        <TextBox Text="{Binding ycoord, UpdateSourceTrigger=PropertyChanged}" Name="y" Height="20" Width="40" Margin="40,81,0,0" HorizontalAlignment="Left" VerticalAlignment="Top"/>
    </Grid>
</Window>

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

using System.Windows;
using System.Windows.Media;
using System.Windows.Shapes;

namespace WpfApp9
{

    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            DataContext = this;      
        }

        private double xval = 50;

        public double xcoord
        {
            get=> xval; 
            set
            {
                xval = value;
                CreateARectangle();
            }
        }

        private double yval = 50;

        public double ycoord
        {
            get => yval;
            set
            {
                yval = value;
                CreateARectangle();
            }
        }
        Rectangle rect = null;
        public void CreateARectangle()
        {
            if (rect == null)
            {
                // Creates a Rectangle  
                rect = new Rectangle();
                rect.Height = ycoord;
                rect.Width = xcoord;
                // Create a Brush  
                SolidColorBrush colorbrush = new SolidColorBrush();
                colorbrush.Color = Colors.Red;
                colorbrush.Opacity = .3;
                SolidColorBrush blackBrush = new SolidColorBrush();
                blackBrush.Color = Colors.Black;
                // Set Rectangle's width and color  
                rect.StrokeThickness = 1;
                rect.Stroke = blackBrush;
                // Fill rectangle with color  
                rect.Fill = colorbrush;
                // Add Rectangle to the Grid.  
                can.Children.Add(rect);
            } 
            else
            {
                rect.Height = ycoord;
                rect.Width = xcoord;
            }
        }
    }
}

В качестве примечания вы также можете создать прямоугольник в XAML, напрямую привязываясь к значениям текстового поля.

    <TextBox Text="50" Name="x" Height="20" Width="40" Margin="10,10,0,0" HorizontalAlignment="Left" VerticalAlignment="Top"/>
    <TextBox Text="50" Name="y" Height="20" Width="40" Margin="10,35,0,0" HorizontalAlignment="Left" VerticalAlignment="Top" RenderTransformOrigin="-0.017,-0.629"/>
    <Rectangle Stroke="Black" Fill="#4CFF0000" Margin="60,5,0,0" Width="{Binding ElementName=x, Path=Text, UpdateSourceTrigger=PropertyChanged}" Height="{Binding ElementName=y, Path=Text, UpdateSourceTrigger=PropertyChanged}"/>
10.06.2019
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

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

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..