15/01/2014
Синхронизация Ленты и системной переменной
Это пример кода, который показывает в комбобоксе Ленты список возможных значений системной переменной LUNITS и обеспечивает синхронизацию этой переменной и комбобокса. Системная переменная LUNITS используется только для демонстрации возможности синхронизации и этот код легко адаптируется для других системных переменных AutoCAD.
Код - C#: [Выделить]
- // AcMgd.dll
- using Autodesk.AutoCAD.Windows.Data;
- // AdWindows.dll
- using Autodesk.Windows;
- // AcWindows.dll
- using Autodesk.AutoCAD.Ribbon;
- public class ExtApp : IExtensionApplication
- {
- private String[] lunitValues = new String[]
- { "1 - Научные",
- "2 - Десятичные",
- "3 - Инженерные",
- "4 - Архитектурные",
- "5 - Дробные"
- };
- // Создаем вкладку на Ленте, панель и комбобокс для LUNITS
- [CommandMethod("Test")]
- public void createLUNITSRibbonCombo()
- {
- RibbonControl ribCntrl
- = RibbonServices.RibbonPaletteSet.RibbonControl;
- RibbonTab ribTab = new RibbonTab();
- ribTab.Title = "Моя вкладка ";
- ribTab.Name = "MyTab";
- ribTab.Id = "MY_TAB_ID";
- ribCntrl.Tabs.Add(ribTab);
- RibbonPanelSource ribSourcePanel = new RibbonPanelSource();
- ribSourcePanel.Title = "МояПанель1";
- RibbonPanel ribPanel = new RibbonPanel();
- ribPanel.Source = ribSourcePanel;
- ribTab.Panels.Add(ribPanel);
- RibbonCombo lunitsRibbonCombo = new RibbonCombo();
- lunitsRibbonCombo.Name = "LUNITSCombo";
- lunitsRibbonCombo.Id = "AdskLUNITSCombo";
- System.Windows.Data.Binding bind1
- = new System.Windows.Data.Binding();
- bind1.Source = lunitValues;
- lunitsRibbonCombo.ShowText = true;
- lunitsRibbonCombo.Size = RibbonItemSize.Large;
- lunitsRibbonCombo.ShowImage = false;
- lunitsRibbonCombo.ItemsSourceBinding = bind1;
- System.Windows.Data.Binding bind2
- = new System.Windows.Data.Binding();
- bind2.Path = new System.Windows.PropertyPath(".");
- lunitsRibbonCombo.ItemTemplateTextBinding = bind2;
- // Устанавливаем начальное значение
- Int16 index = (Int16)
- Application.UIBindings.SystemVariables["LUNITS"].Value;
- lunitsRibbonCombo.Current = lunitValues[index];
- lunitsRibbonCombo.CurrentChanged
- += new EventHandler<RibbonPropertyChangedEventArgs>
- (ribCombo_CurrentChanged);
- ribSourcePanel.Items.Add(lunitsRibbonCombo);
- ribTab.IsActive = true;
- }
- // Функция обратного вызова отслеживает изменения комбобокса для
- // системной переменной LUNITS и установка системной переменной.
- void ribCombo_CurrentChanged
- (
- object sender,
- RibbonPropertyChangedEventArgs e
- )
- {
- ILookup<SystemVariable> sysvars
- = Application.UIBindings.SystemVariables;
- SystemVariable sv = sysvars["LUNITS"];
- String newValue = e.NewValue.ToString();
- int lunits = 1;
- // Установим системную переменную на основе значения комбобокса.
- if (int.TryParse(newValue[0].ToString(), out lunits))
- {
- if (!lunits.ToString().Equals(
- Application.UIBindings.SystemVariables["LUNITS"]
- .Value.ToString()))
- {
- Application.UIBindings.SystemVariables["LUNITS"]
- .Value = lunits;
- }
- }
- }
- // Функция обратного вызова, отслеживающая изменения системной
- // переменной LUNITS и обновляющая комбобокс на основе значения LUNITS
- void sv_PropertyChanged(
- object sender,
- PropertyChangedEventArgs e
- )
- {
- SystemVariable sv = sender as SystemVariable;
- Type svType = sv.GetType();
- PropertyInfo pi = svType.GetProperty(e.PropertyName);
- object propValue = pi.GetValue(sv, null);
- String typeName = propValue.GetType().Name;
- Int16 lunits = (Int16)propValue;
- RibbonControl ribCntrl
- = RibbonServices.RibbonPaletteSet.RibbonControl;
- RibbonItem ri = ribCntrl.FindItem("AdskLUNITSCombo", false);
- RibbonCombo ribbonCombo = ri as RibbonCombo;
- if (ribbonCombo != null)
- {
- object currentItem = ribbonCombo.Current;
- if (!currentItem.ToString().Equals(
- lunitValues[lunits - 1]))
- {
- ribbonCombo.Current = lunitValues[lunits - 1];
- }
- }
- }
- void IExtensionApplication.Initialize()
- {
- // Регистрируем обработчик события изменения
- // системной переменной LUNITS
- ILookup<SystemVariable> sysvars
- = Application.UIBindings.SystemVariables;
- SystemVariable sv = sysvars["LUNITS"];
- sv.PropertyChanged
- += new PropertyChangedEventHandler(sv_PropertyChanged);
- }
- void IExtensionApplication.Terminate()
- {
- // Удаляем обработчик события
- ILookup<SystemVariable> sysvars
- = Application.UIBindings.SystemVariables;
- SystemVariable sv = sysvars["LUNITS"];
- sv.PropertyChanged
- -= new PropertyChangedEventHandler(sv_PropertyChanged);
- }
- }
Источник: http://adndevblog.typepad.com/autocad/2013/07/keeping-a-ribboncombo-in-sync-with-systemvariable.html
Обсуждение: http://adn-cis.org/forum/index.php?topic=461
Опубликовано 15.01.2014