• Как через DragDrop передать объект по ссылке?

    @iRumba Автор вопроса
    Я не просто хочу обращаться к методам и свойствам объекта другого процесса, я хочу, чтобы при закрытии этого "другого" процесса объект остался.
  • Почему у UserControl пропадает Binding?

    @iRumba Автор вопроса
    Вот как то так
    Источник данных-->Spin.Value<---->NumberBox.Value<--(int)Конвертер(string)-->TextBox.Text

    Теряется только однонаправленная привязка с источником данных. Ее нельзя сделать двунаправленной (по логике приложения)
  • Почему у UserControl пропадает Binding?

    @iRumba Автор вопроса
    Я не могу этого сделать. NumberBox привязан через TwoWay к тексту TextBox, на основе которого он сделан. Далее верхний контрол Spin, который является оберткой над NumberBox'ом и имеет еще кнопочку со стрелками вверх и вниз, своим свойством Value привязан к Value NumberBox'а тоже TwoWay. Далее Spin я вставляю в форму и его Value связываю с источником данных Mode=OneWay (так надо), и когда я взаимодействую с контролом через интерфейс (например изменяю его значение колесиком мыши или нажатием на стрелочки кнопки), привязка падает. Хотя у TextBox'ов привязка при этом не теряется.
  • Почему у UserControl пропадает Binding?

    @iRumba Автор вопроса
    Если бы я знал какой код проблемный, я бы сам все исправил )))
    Вот код одного из элементов моего контрола
    public partial class UC_NumberBox : TextBox
        {
            #region ctor
            /// <summary>
            /// Конструктор
            /// </summary>
            public UC_NumberBox()
            {
                InitializeComponent();
                //привязываемся к событию на вставку в текстбокс
                DataObject.AddPastingHandler(this, this.OnPaste);
            }
            #endregion ctor
    
            #region Dependency Properties
            #region DeltaProperty
            /// <summary>
            /// Значение инкремента
            /// </summary>
            public int Delta
            {
                get { return (int)GetValue(DeltaProperty); }
                set { SetValue(DeltaProperty, value); }
            }
    
            public static readonly DependencyProperty DeltaProperty =
                DependencyProperty.Register("Delta", typeof(int), typeof(UC_NumberBox), new PropertyMetadata(1));
            #endregion
    
            #region MinValueProperty
            /// <summary>
            /// Минимальное значение
            /// </summary>
            public int MinValue
            {
                get { return (int)GetValue(MinValueProperty); }
                set 
                {
                    if (value > Value)
                        Value = value;
                    SetValue(MinValueProperty, value); 
                }
            }
    
            public static readonly DependencyProperty MinValueProperty =
                DependencyProperty.Register("MinValue", typeof(int), typeof(UC_NumberBox), new PropertyMetadata(0));
            #endregion
    
            #region MaxValueProperty
            /// <summary>
            /// Максимальное значение
            /// </summary>
            public int MaxValue
            {
                get { return (int)GetValue(MaxValueProperty); }
                set 
                {
                    if (value < Value)
                        Value = value;
                    SetValue(MaxValueProperty, value); 
                }
            }
    
            public static readonly DependencyProperty MaxValueProperty =
                DependencyProperty.Register("MaxValue", typeof(int), typeof(UC_NumberBox), new PropertyMetadata(100));
            #endregion
    
            #region ValueProperty
            /// <summary>
            /// Целочисленное значение
            /// </summary>
            public int Value
            {
                get { return (int)GetValue(ValueProperty); }
                set { SetValue(ValueProperty, value); }
            }
    
            public static readonly DependencyProperty ValueProperty =
                DependencyProperty.Register(
                "Value", 
                typeof(int), 
                typeof(UC_NumberBox), 
                new FrameworkPropertyMetadata(
                    0,
                    new PropertyChangedCallback(OnChangeValue),
                    new CoerceValueCallback(OnCoerceValue)
                    ));
            #endregion ValueProperty
            #endregion Dependency Properties
    
            #region Events
            /// <summary>
            /// Обработчик события на изменение значения
            /// </summary>
            /// <param name="sender">Отправитель</param>
            /// <param name="e">Аргументы</param>
            private static void OnChangeValue(DependencyObject sender, DependencyPropertyChangedEventArgs e)
            {
                //Включаем зависимость значения от свойств максимума и минимума
                sender.CoerceValue(MinValueProperty);
                sender.CoerceValue(MaxValueProperty);
            }
    
            /// <summary>
            /// Обработчик события корректировки значений
            /// </summary>
            /// <param name="sender">Отправитель</param>
            /// <param name="value">Значение</param>
            /// <returns>скорректированное значение</returns>
            private static object OnCoerceValue(DependencyObject sender, object value)
            {
                var nb = (UC_NumberBox)sender;
                int current;
                string str = Convert.ToString(value);
                try
                {
                    current = Convert.ToInt32(str);
                    if (current < nb.MinValue) current = nb.MinValue;
                    if (current > nb.MaxValue) current = nb.MaxValue;
                }
                catch (OverflowException)
                {
                    if (str[0] == '-')
                        current = nb.MinValue;
                    else 
                        current = nb.MaxValue;
                }
                return current;  
            }
    
            /// <summary>
            /// Обработчик события при команде Paste
            /// </summary>
            private void OnPaste(object sender, DataObjectPastingEventArgs e)
            {
                if (e.SourceDataObject.GetDataPresent(DataFormats.Text,true))
                {
                    string pasteText = (string)e.SourceDataObject.GetData(DataFormats.Text);
    
                    string futureText = GetFutureText(pasteText);
                    if (IsIntValid(futureText))
                    {
                        try
                        {
                            Value = Convert.ToInt32(futureText);
                        }
                        catch (OverflowException)
                        {
                            if (futureText[0] == '-') 
                                Value = MinValue; 
                            else 
                                Value = MaxValue;
                        }                      
                    }                    
                }
                e.CancelCommand();
            }
    
            /// <summary>
            /// Обработчик события на ввод текста с клавиатуры
            /// </summary>
            /// <param name="sender">Отправитель</param>
            /// <param name="e">Аргументы</param>
            private void tb_PreviewTextInput(object sender, TextCompositionEventArgs e)
            {
                e.Handled = true;
                string futureText = GetFutureText(e.Text);
                if (IsIntValid(futureText))
                {
                    e.Handled = false;
                }
            }
    
            /// <summary>
            /// Обработчик события на нажатие кнопок клавиатуры 
            /// (в данный момент ловит только стрелки вверх и вниз)
            /// </summary>
            /// <param name="sender">Отправитель</param>
            /// <param name="e">Аргументы</param>
            private void tb_KeyDown(object sender, KeyEventArgs e)
            {
                if (e.Key == Key.Up) Plus();
                if (e.Key == Key.Down) Minus();
    
            }
    
            /// <summary>
            /// Обработчик событий вращения колесика мыши
            /// </summary>
            /// <param name="sender">Отправитель</param>
            /// <param name="e">Аргументы</param>
            public void OnMouseWheel(object sender, MouseWheelEventArgs e)
            {
                if (e.Delta > 0) Plus();
                if (e.Delta < 0) Minus();
            }
            #endregion Events
    
            #region Methods
            /// <summary>
            /// Получить текст с учетом введенных или вставленных командой Paste строк
            /// </summary>
            /// <param name="s">Добавленная строка</param>
            /// <returns>готовый текст</returns>
            private string GetFutureText(string s)
            {
                return (this.SelectionLength>0 ? Text.Remove(SelectionStart,SelectionLength).Insert(SelectionStart,s) : Text.Insert(CaretIndex,s));
            }
    
            /// <summary>
            /// Прибавить значение
            /// </summary>
            /// <param name="value">Значение которое нужно прибавить (если отрицательное, то отнимется)</param>
            private void AddIncrement(int value)
            {
                Value += value;
            }
    
            public void Plus()
            {
                AddIncrement(Delta);
            }
    
            public void Minus()
            {
                AddIncrement(-Delta);
            }
    
            /// <summary>
            /// Проверка на валидность текста для приведения к Int32
            /// </summary>
            /// <param name="s">Текст для проверки</param>
            /// <returns>истину, если текст валидный</returns>
            private bool IsIntValid(string s)
            {
                if (s[0] == '+' || s[0] == '-')
                    s = s.Substring(1);
                foreach (char c in s)
                    if (!"0123456789".Contains(c))
                        return false;
                return true;
            }
            #endregion Methods
        }
    
        public class IntToStringConverter : IValueConverter
        {
    
            public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
            {
                if (value is int)
                    return System.Convert.ToString(value);
                return "";
            }
    
            public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
            {
                if (value is string)
                {
                    int res;
                    try
                    {
                        res = System.Convert.ToInt32(value);
                    }
                    catch (Exception)
                    {
                        res = 0;
                    }
                    return res;
                }
                return 0;
            }
    
        }
  • Как запретить уменьшать WPF форму, когда содержимое не вмещается?

    @iRumba Автор вопроса
    Я так и сделал, но мне эта идея не нравится, потому что приходится высчитывать этот MinWidth из таких же свойств дочерних компонентов. Форма сама по себе очень громоздкая, поэтому ее минимальный размер не должен быть больше чем требуется. Ну и меньше чем требуется конечно же :)
  • Как проверить что TCP клиент отключился?

    @iRumba Автор вопроса
    у NetworkStream свойство Length не поддерживается. Конвертировать его в MemoryStream? Думал об этом, но я не знаю как это будет выглядеть. При изменении объекта theNetworkStream, будет ли изменяться созданный на его основе theMemoryStream? Ну, то есть будет ли работа с мемористримом актуально в любой момент времени?

    И еще, а почему при закрытии сервера клиент нормально отключается?
  • Как определить возвращает ли экземпляр Delegate значение?

    @iRumba Автор вопроса
    Предложите код, я не могу представить, то что вы говорите. (
  • Как дефрагментировать по содержимому папок и есть ли в этом смысл?

    @iRumba Автор вопроса
    И то верно. А такое дефрагментаторы делают?
  • Почему не работает шаблон?

    @iRumba Автор вопроса
    AxisPod: поменял this на Menu. Это даже не компилируется. Первую проблему я решил, теперь нужно динамически заполнять меню в рунтайме.
  • Почему не работает шаблон?

    @iRumba Автор вопроса
    Артём: извиняй, зря я так на тебя. Настолько запутался, что не допетрил, что мне нужно не миллион классов Window1..., а миллион его экземпляров.
  • Почему не работает шаблон?

    @iRumba Автор вопроса
    Артём: вот именно. Мой код
    <controls:NeoWindow
    Вариант с миллионом одинаковых шаблонов для каждого окна я даже рассматривать не буду. Если реально хотите помочь, предложите рабочий вариант с обобщенным шаблоном для всех окон window1, window2 и тд
  • Почему не работает шаблон?

    @iRumba Автор вопроса
    AxisPod: С этого момента поподробнее можно? Какие исключения перехватывает дизайнер? Он же при этом их обрабатывает, раз шаблон в итоге отображает? Разве дизайнер такое может? Как это отловить или проверить?
  • Почему не работает шаблон?

    @iRumba Автор вопроса
    AxisPod: То что в этой строке Null - результат того, что шаблон не подключился во время выполнения. Скажите почему?
  • Почему не работает шаблон?

    @iRumba Автор вопроса
    AxisPod: Это дополнительная часть. Прежде чем разбираться что с ней не так, нужно решить основную проблему.
    "Начинать строительство нужно с фундамента" (с) Ашот
  • Почему не работает шаблон?

    @iRumba Автор вопроса
    AxisPod: так вы не на вопрос отвечаете. Я не спрашивал что не так с этой строкой. Я прежде чем его задавать вообще комментил эту строку. Форма открывается пустой, хотя в дизайнере все нормально отображается. Так причем тут эта строка?
  • Почему не работает шаблон?

    @iRumba Автор вопроса
    Артём: вы не правы. Таких window может быть миллион. Window1, window2, window3 и тд.... Мне что, для каждого писать отдельный шаблон? )))))))

    с МСДНа

    <Style TargetType="{x:Type TextBlock}">
    ***
    <ControlTemplate TargetType="Label">


    Заметьте, не TextBlock1 и не Label1 ;-)
  • Почему не работает шаблон?

    @iRumba Автор вопроса
    AxisPod: я, конечно, попробую, только после того, как исправится вот это
    в дизайнере шаблон отображается нормально, а вот при запуске окно пустое

    Что толку искать это меню, если его нет?
  • Почему не работает шаблон?

    @iRumba Автор вопроса
    А у меня там что? :0
  • Почему не работает шаблон?

    @iRumba Автор вопроса
    - Капитан, у нас пробоина, корабль тонет, что делать?
    - Заделайте пробоину... )))

    тут понятно где нулл
    (Menu)this.Template.FindName("mainMenu", this)

    я же написал
    в дизайнере шаблон отображается нормально, а вот при запуске окно пустое


    Вопрос, почему оно null?
  • Как добавить MultiBindig в PointCollection?

    @iRumba Автор вопроса
    Роман: Антон Папин: проблема уже неактуальна. Оказывается векторное изображение можно растягивать разными способами под размеры полигона штатными методами. То есть я могу нарисовать квадрат 2х2 и растянуть его по размеру полигона или оставить пропорции без изменения, растянув по меньшему измерению.