2009-01-30 3 views
6

У меня есть приложение Silverlight, на котором есть холст. На этом холсте я динамически «рисую» кучу вещей, но добавляю элементы управления к холсту.Silverlight: Сила Canvas, чтобы недействить или перекрасить себя?

У меня есть кнопка за пределами области Холста, которая очищает содержимое. Объекты удаляются (успешно). Однако область Canvas не обновляется непосредственно; он в настоящее время требует MouseOver или другого события для самого холста.

Каков самый простой способ иметь внешний объект для аннулирования холста? Я уверен, что я пропустил что-то простое!

ответ

4

Это немного неряшливый, но вы могли бы попытаться изменить видимость «Видимый» (несмотря на то, что уже есть) из холста, так:

myCanvas.Visibility = Visibility.Visible; 

Мы обнаружили, что эти силы, как перерисовать, даже если фактическое значение myCanvas.Visible не изменилось ...

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

+0

Как-то моя проблема решена сама собой. Однако этот ответ превосходный, потому что он очень низкий. Я, скорее всего, добавлю это в свой код в качестве защитной меры. – pearcewg

1

В случае, если кто приходит после того, как тот факт, как я искал этот ответ ...

yourFrameworkElement.InvalidateArrange(); 
yourFrameworkElement.UpdateLayout(); 

работал для меня.

примечание: вызывающий только this.yourFrameworkElement.UpdateLayout(); сделал нет работа для меня. Мне пришлось позвонить InvalidateArrange(). Я сразу позвонил UpdateLayout() для полноты - вероятно, имеет нулевое реальное воздействие.

Также трюк myCanvas.Visibility = Visibility.Visible; не работал для меня, поскольку я пытался вызвать событие LayoutUpdated.

+0

Не стал перерисовать меня. Кажется, это не решение этой проблемы. – Brett

1

Не простой однострочный вкладыш, но он работает. Это хорошо работает в моем опыте. Он откладывает данное действие на десятую часть секунды, чтобы разрешить поток пользовательского интерфейса обновляться, но он все еще выполняет действие в потоке пользовательского интерфейса.

using System; 
using System.Windows.Threading; 

public static class MyTestClass 
{ 
    public static void Postpone(Action a_action) 
    { 
     TaggedDispatchTimer timer = new TaggedDispatchTimer(); 
     timer.Interval = TimeSpan.FromSeconds(0.1); 
     timer.Tick += OnDoPostponedAction; 
     timer.UserState = a_action; 
     timer.Start(); 
    } 

    private static void OnDoPostponedAction(object sender, EventArgs e) 
    { 
     TaggedDispatchTimer timer = sender as TaggedDispatchTimer; 
     timer.Stop(); 
     timer.Tick -= OnDoPostponedAction; 

     var action = timer.UserState as Action; 
     if (action != null) 
      action(); 
    } 
} 

public class TaggedDispatchTimer : DispatcherTimer 
{ 
    public Object UserState { get; set; } 

} 

Вот как я использую его:

MyTestClass.Postpone(() => 
    { 
     // Do some bloody long operation. 
    }); 
0

В моем случае (я имел Canvas внутри холста, и мне нужно, чтобы изменить внутреннее полотно из-за изменения ориентации), в myCanvas.Visibility = Visibility.Visible; трюк Бесполезный Не делайте этого, но это было действительно так:

myCanvas.Visibility = Visibility.Collapsed; 
myCanvas.Visibility = Visibility.Visible; 

работал просто отлично.

InvalidateArrange, а затем UpdateLayout также этого не делал.

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

Смежные вопросы